在空闲地浏览名称空间时,我注意到一个名为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

当前回答

在Python 3中,您可以¹使用Ellipsis文字。。。作为尚未编写的代码的“nop”占位符:

def will_do_something():
    ...

这不是魔法;可以使用任何表达式来代替。。。,例如。:

def will_do_something():
    1

(不能使用“受制裁”一词,但我可以说,圭多并没有断然拒绝使用这个词。)

¹“can”不在{“must”,“should”}中

其他回答

__getitem_最小。。。自定义类中的示例

当神奇的语法。。。在自定义类中传递给[],__getitem__()接收Ellipse类对象。

然后,类可以对这个Singleton对象做任何它想做的事情。

例子:

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 the Ellipsis class object.
# Ellipsis is a singleton, so we can compare with `is`.
assert C()[...] is Ellipsis

# Everything mixed up.
assert C()[1, 2:3:4, ..., 6] == (1, slice(2,3,4), Ellipsis, 6)

Python内置列表类选择为其提供范围的语义,当然,任何合理的用法都应该如此。

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

在Python 3.5.2和2.7.12中测试。

与Python3.5和PEP484一样,在使用类型模块时,文本省略号用于向静态类型检查器表示某些类型。

示例1:

可以使用一种类型和省略号来表示任意长度的同构元组,例如Tuple[int,…]

示例2:

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

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

您可以在像numpy这样的自定义切片情况下自己使用Ellipse,但它在任何内置类中都没有使用。

我不知道它是不是专门为在numpy中使用而添加的,但我肯定没有在其他地方看到过它。

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

从Python文档中:

此对象通常用于切片(请参见切片)。它不支持特别行动。只有一个省略号对象,名为椭圆(内置名称)。类型(椭圆)()生成椭圆单例。它被写成椭圆或。。。。

总结其他人所说的,与Python 3一样,Ellipsis本质上是另一个类似于None的单例常量,但没有特定的用途。现有用途包括:

在切片语法中表示剩余维度中的完整切片在类型提示中,仅指示类型的一部分(Callable[…,int]或Tuple[str,…])在类型存根文件中,指示有一个默认值,而不指定它

可能的用途包括:

作为“无”是有效选项的地方的默认值作为尚未实现的函数的内容