在闲逛名称空间时,我注意到一个看起来很奇怪的对象叫做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


评论

请参阅stackoverflow.com/questions/752602/…
的答案
我发现是这样的:我输入了x = []; x.append(x); print(x),以了解它如何处理循环对象的字符串化。它返回了[[...]]。我以为“我想知道如果我输入[[...]]会发生什么?我猜这会引发语法错误。相反,它返回了[[Ellipsis]]。Python太奇怪了。随后的Google搜索带来了我到此页面。

请注意,递归repr中的...只是一个占位符,与省略号无关。

完全顺便说一句,导入中的三点表示“从两个程序包导入”。

@croq stackoverflow.com/q/32395926/2988730。 stackoverflow.com/q/1054271/2988730。这两个人应该解释所有内容,并在答案中带有指向docs和PEP的正确链接。

#1 楼

这是最近另一个问题。我将从那里详细说明我的答案:

省略号是一个可以以切片表示法显示的对象。例如:

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


它的解释完全取决于实现__getitem__函数并在其中看到Ellipsis对象的对象,但其主要(和预期的)用途是小数点-party库,它添加了多维数组类型。由于存在多个维度,因此切片变得比仅起始索引和终止索引更为复杂;能够在多个维度上切片也很有用。例如,给定4x4数组,左上角的区域将由切片[: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中,Ellipsis文字(...)在切片语法之外可用,因此您可以实际编写:

>>> ...
Ellipsis


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

评论


它也用在存根文件中的PEP484类型提示中

–noɥʇʎԀʎzɐɹƆ
16年7月14日在20:01

以防万一有人好奇:它也用于标准库输入模块中:例如Callable [...,int]表示可返回未指定签名的int的可调用对象,或者Tuple [str,...]表示可变长度的字符串同形元组。

–Anakhand
19年6月9日在10:31

仅供参考,FastAPI框架(适用于python 3.6+)也(现在)使用它。 fastapi.tiangolo.com/tutorial/query-params-str-validations

–安德鲁·阿莱尔(Andrew Allaire)
19年7月17日在18:02

@ArtOfWarfare您完全正确,这是来自一个口头说“省略号”而不是在句子之间拖尾的人。

–PrimeRibeyeDeal
19年10月2日在18:15

我找到了这个。在列表中进行自参考(循环参考)时,似乎会出现:a = [1,2]; a [0] = a; print(a)给出[[...],2]。这是同一件事还是不同用途?

– Bill
1月26日18:20

#2 楼

在Python 3中,您可以¹将省略号...用作尚未编写的代码的“ nop”占位符:
def will_do_something():
    ...

这不是魔术;可以使用任何表达式代替...,例如:
def will_do_something():
    1

(不能使用“批准的”一词,但是我可以说Guido并没有完全拒绝这种用法。)
¹'can' not in {'must', 'should'}

评论


在半会议中,我经常看到...用在人们想要指出他们打算稍后填充的内容(“待办事项”空块)并表示没有代码的块的地方。

–加雷斯·拉蒂(Gareth Latty)
2012年4月16日在1:04



Python还具有NotImplemented文字,当您希望不完整的函数返回有意义的内容(而不是示例中的None)时,它很有用。 (另一个用例:实现算术运算)

– zvyn
2015年6月26日5:19



@zvyn这不是文字。这只是一个名字。例如,NotImplemented ='something_else'是有效的python,但是... ='something_else'是语法错误。

– Wim
16年4月13日在17:51

@zvyn如果导入该模块时发生异常怎么办? :)

– pizzapants184
17年4月24日,1:15

@zvyn NotImplemented不能替代None。它的用法相当狭窄。在这里查看文档

–汉斯
18/12/11在10:46

#3 楼

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

示例1:


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


示例2:


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


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


#4 楼

指定预期的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


评论


但这实际上是否涉及Ellipsis对象?这不仅仅是doctest解析器/匹配器的功能吗?

– akaihola
17年1月21日在5:53

@akaihola我会说确实如此,如doctest.ELLIPSIS中所述。我希望...的大多数(如果不是全部)用法都是语法的,并且不要使用实际的Ellipsis对象。难道它仅仅是适应性概念的方便名称吗?

–nealmcb
17年4月21日在12:57

#5 楼

总结别人所说的内容,从Python 3开始,Ellipsis本质上是另一个类似于None的单例常量,但没有特定的预期用途。现有用途包括:


在分片语法中表示剩余尺寸中的完整分片
在类型提示中仅指示类型的一部分(Callable[..., int]Tuple[str, ...]
在类型存根文件中表示有默认值但未指定默认值

可能的用途包括:


作为None有效的地方的默认值选项
作为尚未实现的功能的内容


#6 楼

来自Python文档:


该对象通常用于切片(请参见切片)。它不支持
特殊操作。恰好有一个省略号对象,名为
Ellipsis(内置名称)。 type(Ellipsis)()产生省略号
单例。

它写为Ellipsis...


#7 楼

自定义类中的最小__getitem__示例

自定义类中将魔术语法...传递给...时,[]会收到一个__getitem__()类对象。

然后该类可以做这个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内置的Ellipsis类选择为其赋予其语义

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

已在Python 3.5.2和2.7.12中进行了测试。

评论


使用-O参数运行此代码,您的代码将始终运行; D

– moshevi
19年2月7日在11:59



#8 楼

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

我不知道是否专门为numpy添加了它,但我

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

#9 楼

正如@noɥʇʎԀʎzɐɹƆ和@phoenix提到的-您确实可以在存根文件中使用它。例如

class Foo:
    bar: Any = ...
    def __init__(self, name: str=...) -> None: ...


https://www.python.org/dev/peps/pep-0484/#可以找到更多信息和如何使用此省略号的示例。存根文件

评论


好的,然后当我实际实例化该类并运行省略号时会发生什么?

–罗伯特
10月20日17:57

#10 楼

这是等效的。
l=[..., 1,2,3]
l=[Ellipsis, 1,2,3]

...是在built-in constants内部定义的常量。

省略号
与省略号“ ...”相同。特殊值,通常与用户定义的容器数据类型的扩展切片语法结合使用。


#11 楼

它的预期用途不仅应用于这些第三方模块。在Python文档中没有适当提及它(或者也许我找不到),但是省略号...实际上至少在一个地方用在CPython中。

它用于表示Python中的无限数据结构。我在玩列表时碰到了这种符号。

有关更多信息,请参阅此问题。

评论


不同的东西。这个问题询问省略号的内置类型和Ellipsis对象。用椭圆表示无限数据结构纯粹是为了显示,与椭圆类型或Ellipsis对象无关。

– chys
2014-2-27在6:34



@chys实际上,它的作用很小-Python __repr__字符串旨在成为有效的Python表达式-如果不是像该语言那样存在于该语言中的省略号,则表示形式将不是有效的表达式。

–加雷斯·拉蒂(Gareth Latty)
2014年8月1日15:44



@Lattyware好吧,这确实是原始设计的目的。它还打算使eval(repr(a))的目标等于a。不幸的是,即使对于内置类型,在实践中也不时是错误的。试试看:a = [];附录(a); eval(repr(a))。 repr(a)是[[...]],在Python 2中是无效的表达式。(在Python 3中是有效的,但评估结果有所不同,仍然与初衷相反。)

– chys
2014年8月4日在5:07

#12 楼

在typer中,...用于创建必需的参数:Argument类需要一个默认值,如果您传递...,它将在用户未传递特定参数的情况下发出抱怨。
如果None,您可以使用Ellipsis来表示相同的值。不存在,但这可以消除表达None为默认值的机会,以防在您的程序中有意义。