省略号对象是做什么用的?

850
当我闲逛命名空间时,我注意到一个叫做“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

3
请参阅 https://dev59.com/2XRB5IYBdhLWcg3wAjJH 的答案。 - Patrick McElhaney
49
我这样发现的:我输入了“x=[];x.append(x);print(x)”来查看它如何处理循环对象的字符串化。 它返回了“[[...]]”。 我想:“如果我输入[[...]]会发生什么?” 我猜测会抛出语法错误。但是,它返回了“[[Ellipsis]]”。Python真是太奇怪了。随后进行的谷歌搜索将我带到了这个页面。 - Cyoce
53
请注意,递归 repr 中的 ... 只是一个占位符,并且与 Ellipsis 没有任何关系。 - Eevee
40
顺便提一下,在导入中使用三个点(...)表示“从上两级包中导入”。 - Mad Physicist
2
@croq https://dev59.com/PlwY5IYBdhLWcg3wpJA-。https://dev59.com/6HNA5IYBdhLWcg3wNa2T。这两个链接应该能够解释一切,答案中还包含了文档和PEP的适当链接。 - Mad Physicist
显示剩余5条评论
14个回答

5

这是等价的。

l=[..., 1,2,3]
l=[Ellipsis, 1,2,3]

Ellipsis 是在内置常量中定义的一个常量。

Ellipsis

与省略号字面值“…”相同。主要与用户定义的容器数据类型的扩展切片语法一起使用的特殊值。


2

它的预期使用不应仅限于这些第三方模块。在Python文档中没有很好地提到(或者也许我只是没找到),但省略号 ... 在CPython中实际上用于表示Python中的无限数据结构,我在尝试处理列表时遇到了这种符号。

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


13
不同的事物。这个问题涉及到Python中内置的ellipsis类型和Ellipsis对象。使用省略号来表示无限数据结构仅用于显示,与ellipsis类型或Ellipsis对象无关。我会尽力使翻译通俗易懂并保留原意,不包含解释和其他额外信息。 - chys
4
实际上,Python的__repr__字符串确实以一种微小的方式起作用 - 它们旨在成为有效的Python表达式 - 如果不是因为省略号在语言中存在的方式,该表示法将不是一个有效的表达式。 - Gareth Latty
4
@Lattyware 嗯,原始设计确实是这样的。它还打算让 eval(repr(a)) 等于 a。不幸的是,在实践中,即使是内置类型也有时会出现错误。试试这个:a=[]; a.append(a); eval(repr(a))。在 Python 2 中,repr(a)[[...]],这是无效的表达式。(在 Python 3 中,它是有效的,但 eval 的结果仍然与原意相反。) - chys

2

2
typer 中,使用 ... 来创建必需参数: Argument 类需要一个默认值,如果传递了 ... ,它将会在用户未传递特定参数时发出警告。
如果没有 Ellipsis,您可以使用 None 来实现相同的效果,但这将消除表达 None 是默认值的机会,以防这在程序中有任何意义。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接