Python省略号对象做什么?

在闲逛的时候,我注意到了一个名叫“ Ellipsis ”的奇怪对象,它似乎没有做任何特别的事情,但它是一个全球可用的内建。

在搜索后,我发现它被Numpy和Scipy的切片语法的一些不为人知的变体使用…但几乎没有别的。

这个对象是专门为了支持Numpy + Scipy而添加的吗? 省略号具有任何通用含义或用途吗?

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 

最近又出现了另一个问题 。 我会详细说明我的答案

省略号是可以出现在切片符号中的对象。 例如:

 myList[1:2, ..., 0] 

它的解释完全取决于实现__getitem__函数,并在那里看到了Ellipsis对象,但是它的主要(和预期的)用途是在数字python扩展中,它增加了一个多维数组类型。 由于有多个维度,所以切片比起始和停止索引变得更复杂。 能够在多个维度上切片也是有用的。 例如,给定一个4×4数组,左上方的区域将由slice [: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阵列, a[...,0]a[:,:,0] , 4d, a[:,:,:,0] ,类似地, a[0,...,0]a[0,:,:,0] (中间有许多冒号组成整数数组中的维数)。

有趣的是,在python3中,省略号字面( ... )可以在slice语法之外使用,所以你可以写下:

 >>> ... Ellipsis 

除了各种数字类型,不,我不认为它被使用。 据我所知,它是纯粹为了numpy的使用而添加的,除了提供对象和相应的语法外,没有核心的支持。 在那里的对象不需要这个,但是切片的文字“…”支持。

在Python 3中,您可以使用省略号文字...作为代码的“nop”占位符:

 def will_do_something(): ... 

不是魔术; 任何表达式都可以用来代替... ,例如:

 def will_do_something(): 1 

(不能用“被制裁”一词,但我可以说这种用法并没有被Guido 完全拒绝 。)

指定预期的doctest输出时,您还可以使用省略号:

 class MyClass(object): """Example of a doctest Ellipsis >>> thing = MyClass() >>> # Match <class '__main__.MyClass'> and <class '%(module).MyClass'> >>> type(thing) # doctest:+ELLIPSIS <class '....MyClass'> """ pass 

从Python文档 :

该对象由扩展切片符号使用(请参阅Python参考手册 )。 它不支持特殊操作。 只有一个省略号对象,名为Ellipsis (内置名称)。

从Python 3.5和PEP484开始 ,在使用打字模块时,文字省略号用于将某些类型表示为静态类型检查器。

例1:

任意长度齐次元组可以用一个类型和省略号来表示,例如Tuple[int, ...]

例2:

通过用文字省略号(三个点)替换参数列表,可以声明可调用的返回类型,而不指定调用签名:

 def partial(func: Callable[..., str], *args) -> Callable[..., str]: # Body 

您可以自己使用省略号,在像numpy这样的自定义切片情况下,但在任何内建类中都没有用法。

我不知道它是否是专门用于numpy,但我当然没有看到它在其他地方使用。

另请参见: 如何在Python中使用省略号切片语法?

__getitem__最小的例子

当你使用“看上去很神奇”的语法时,作为一个单例类魔法值传递给__getitem__

班级随后可以随心所欲地做任何事情。

例:

 class C(object): def __getitem__(self, k): return k # Single argument is passed directly. assert C()[0] == 0 # Multiple indices generate a tuple. assert C()[0, 1] == (0, 1) # Slice notation generates a slice object. assert C()[1:2:3] == slice(1, 2, 3) # Ellipsis notation generates an Ellipsis class object. assert C()[...] == Ellipsis 

Python内置的list类选择给它一个范围的语义,当然它的任何理智用法也应该是这样。

就我个人而言,我只是远离它在我的API中,而是创建一个单独的,更明确的方法。

其预期用途不应仅限于这些第三方模块。 在Python文档中没有正确提到(或者我可能找不到),但省略号...实际上在CPython中至少在一个地方使用。

它用于表示Python中的无限数据结构。 我在列表中找到这个符号。

看到这个问题的更多信息。