在空闲地浏览名称空间时,我注意到一个名为Ellipsis的奇怪对象,它看起来没有什么特别之处,也没有做什么特别的事情,但它是一个全局可用的内置对象。
经过搜索,我发现Numpy和Scipy在切片语法的一些模糊变体中使用了它。。。但几乎没有其他。
该对象是否专门添加到语言中以支持Numpy+Scipy?Ellipsis有任何通用的含义或用途吗?
D:\workspace\numpy>python
Python 2.4.4 (#71, Oct 18 2006, 08:34:43) [MSC v.1310 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> Ellipsis
Ellipsis
与Python3.5和PEP484一样,在使用类型模块时,文本省略号用于向静态类型检查器表示某些类型。
示例1:
可以使用一种类型和省略号来表示任意长度的同构元组,例如Tuple[int,…]
示例2:
通过用文字省略号(三个点)替换参数列表,可以在不指定调用签名的情况下声明可调用的返回类型:
def partial(func: Callable[..., str], *args) -> Callable[..., str]:
# Body
与Python3.5和PEP484一样,在使用类型模块时,文本省略号用于向静态类型检查器表示某些类型。
示例1:
可以使用一种类型和省略号来表示任意长度的同构元组,例如Tuple[int,…]
示例2:
通过用文字省略号(三个点)替换参数列表,可以在不指定调用签名的情况下声明可调用的返回类型:
def partial(func: Callable[..., str], *args) -> Callable[..., str]:
# Body
这在最近的另一个问题中出现。我将从那里详细阐述我的答案:
椭圆是一种可以以切片表示法显示的对象。例如:
myList[1:2, ..., 0]
它的解释完全取决于实现__getitem_函数并在那里看到Ellipsis对象,但它的主要(和预期)用途是numpy第三方库,它添加了一个多维数组类型。由于有不止一个维度,切片变得比仅仅是开始和停止索引更复杂;能够在多个维度上进行切片也是有用的。例如,给定一个4×4阵列,左上区域将由切片[:2,:2]定义:
>>> a
array([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12],
[13, 14, 15, 16]])
>>> a[:2, :2] # top left
array([[1, 2],
[5, 6]])
进一步扩展这一点,这里使用椭圆来表示未指定的其余数组维度的占位符。可以将其视为表示间隙中所有维度的完整切片[:],因此对于3d数组,[…,0]与[:,:,0]相同,对于4d,a[:,,:,:。
有趣的是,在python3中,省略文本(…)在切片语法之外是可用的,因此您实际上可以编写:
>>> ...
Ellipsis
EDIT:Ellipsis也用于标准库类型模块:例如Callable[…,int]表示返回int而不指定签名的可调用对象,或tuple[str,…]表示字符串的可变长度同质元组。