在闲置浏览命名空间时,我注意到一个名为“省略号”的奇怪物体,它似乎没有或做任何特别的事情,但它是全局可用的内置物。
在搜索之后,我发现它被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
答案 0 :(得分:447)
最近又出现了另一个question。我将从那里详细说明我的answer:
Ellipsis是一个可以以切片表示法出现的对象。例如:
myList[1:2, ..., 0]
它的解释完全取决于实现__getitem__
函数的任何内容,并在那里看到Ellipsis
个对象,但它的主要(和预期)用途是numeric python扩展,它增加了一个多维数组类型。由于存在多个维度,因此切片变得比起始和停止索引更复杂;能够在多个维度中切片也很有用。例如,给定一个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,{{ 1}},类似地,a[:,:,:,0]
是a[0,...,0]
(但是中间有许多冒号构成数组中的全部维数)。
有趣的是,在python3中,省略号文字(a[0,:,:,0]
)可以在切片语法之外使用,所以你实际上可以写:
...
除了各种数字类型,不,我不认为它被使用。据我所知,它纯粹是为了使用numpy而添加,除了提供对象和相应的语法之外没有核心支持。那里的对象并不需要这个,但对切片的字面“......”支持确实如此。
答案 1 :(得分:157)
在Python 3中,您可以使用省略号文字...
作为代码的“nop”占位符:
def will_do_something():
...
这是不魔法;可以使用任何表达式代替...
,例如:
def will_do_something():
1
(不能使用“制裁”这个词,但我可以说Guido使用的是not outrightly rejected。)
答案 2 :(得分:41)
您还可以在指定预期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
答案 3 :(得分:41)
从Python 3.5和PEP484开始,使用typing模块时,文字省略号用于表示静态类型检查器的某些类型。
示例1:
可以使用一种类型和省略号表示任意长度的同类元组,例如
Tuple[int, ...]
示例2:
可以通过用文字省略号(三个点)替换参数列表来声明可调用的返回类型而不指定调用签名:
def partial(func: Callable[..., str], *args) -> Callable[..., str]:
# Body
答案 4 :(得分:31)
此对象由扩展切片使用 表示法(请参阅 Python Reference Manual )。它没有特别的支持 操作。只有一个 省略号对象,名为
Ellipsis
(a 内置名称)。
答案 5 :(得分:14)
总结其他人所说的内容,从Python 3开始,省略号本质上是另一个类似于f: 2 - Thread[main,5,main]
的单例常量,但没有特定的用途。现有用途包括:
None
或Callable[..., int]
)可能的用途包括:
Tuple[str, ...]
是有效选项的地方的默认值答案 6 :(得分:11)
你可以在numpy已经完成的自定义切片情况下自己使用省略号,但它在任何内置类中都没有用。
我不知道它是否专门用于numpy,但我当然没有看到它用于其他地方。
答案 7 :(得分:9)
import myLibrary.*;
最小__getitem__
示例
当魔术语法...
传递给自定义类中的...
时,[]
会收到__getitem__()
类对象。
然后,类可以使用此Singleton对象执行任何操作。
示例:
Ellipsis
Python内置的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)
类选择为它提供范围的语义,当然也应该使用它的任何合理用法。
就个人而言,我只是在我的API中远离它,而是创建一个单独的,更明确的方法。
在Python 3.5.2和2.7.12中测试。
答案 8 :(得分:2)
其预期用途不应仅适用于这些第三方模块。在Python文档中没有正确提及(或者我可能找不到),但省略号...
实际上至少在一个地方用于CPython 。
它用于表示Python中的无限数据结构。我在玩名单时遇到了这个符号。
有关详细信息,请参阅this question。
答案 9 :(得分:2)
正如@noɥʇʎԀʎzɐɹƆ和@phoenix所提到的 - 你确实可以在存根文件中使用它。例如
class Foo:
bar: Any = ...
def __init__(self, name: str=...) -> None: ...
中找到有关如何使用此省略号的更多信息和示例
答案 10 :(得分:0)
这等效。
l=[..., 1,2,3]
l=[Ellipsis, 1,2,3]
...
是在built-in constants
内部定义的常量。
省略号
与省略号“ ...”相同。特殊值,通常与扩展切片语法结合使用,用于用户定义的容器数据类型。
答案 11 :(得分:0)
在typer中,...
用于创建必需的参数:Argument
类需要一个默认值,如果您通过...
,它将抱怨用户是否这样做。不传递特定的参数。
如果None
不存在,您可以使用Ellipsis
进行相同操作,但这将消除表示None
是默认值的机会,以防在您的程序中有意义。
答案 12 :(得分:0)
FastAPI 使用省略号来创建所需的参数。 https://fastapi.tiangolo.com/tutorial/query-params-str-validations/
答案 13 :(得分:0)
对于在大量使用 Pydantic 的代码库中工作而获得此答案的任何人:这也是 Pydantic 指示必填字段但可以设置为 None
的方式,他们将其称为“{{3 }}”。这就是它们最终也被用于 FastAPI 的原因。