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
#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
为默认值的机会,以防在您的程序中有意义。
评论
请参阅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的正确链接。