Ellipsis对象做什么?

在漫不经心地浏览命名空间时,我注意到一个名为Ellipsis的奇怪对象,它似乎没有什么特别之处,但它是一个全局可用的内置对象。

经过搜索,我发现它被Numpy和Slipy用于切片语法的一些模糊变体……但几乎没有其他东西。

这个对象是否专门添加到语言中以支持Numpy+Slipy?Ellipsis是否有任何通用含义或用途?

D:\workspace\numpy>pythonPython 2.4.4 (#71, Oct 18 2006, 08:34:43) [MSC v.1310 32 bit (Intel)] on win32Type "help", "copyright", "credits" or "license" for more information.>>> EllipsisEllipsis
267722 次浏览

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

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

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

python留档

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

它被写成Ellipsis...

这是最近在另一个问题中出现的。我将从那里详细说明我的回答

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

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

它的解释纯粹取决于实现__getitem__函数并在那里看到Ellipsis对象的任何东西,但它的主要(和预期)用途是在numpy第三方库中,它添加了一个多维数组类型。由于有不止一个维度,切片变得不仅仅是开始和停止索引更复杂;能够在多个维度中切片也是有用的。例如,给定一个4×4数组,左上角区域将由切片[:2, :2]定义:

>>> aarray([[ 1,  2,  3,  4],[ 5,  6,  7,  8],[ 9, 10, 11, 12],[13, 14, 15, 16]])
>>> a[:2, :2]  # top leftarray([[1, 2],[5, 6]])

进一步扩展,这里使用省略号来指示未指定的其余数组维度的占位符。将其视为指示其放置的间隙中所有维度的完整切片[:],因此对于3d数组,a[..., 0]a[:, :, 0]相同,对于4da[:, :, :, 0],类似地,a[0, ..., 0]a[0, :, :, 0](中间有多少冒号构成了数组中的全部维度)。

有趣的是,在python3中,省略号文字(...)在切片语法之外可用,因此您实际上可以编写:

>>> ...Ellipsis

编辑:省略号也用于标准库typing模块:例如Callable[..., int]表示返回int而不指定签名的可调用对象,或tuple[str, ...]表示可变长度的同质字符串元组。

在Python 3中,可以将省略号文字...用作尚未编写的代码的“nop”占位符:

def will_do_something():...

这是没有魔术;可以使用任何表达式来代替...,例如:

def will_do_something():1

(不能使用“制裁”这个词,但我可以说,这种用法是圭多的没有被彻底拒绝

'can' not in {'must', 'should'}

您还可以在指定预期的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

它的预期用途不应该仅用于这些第三方模块。它在Python留档中没有正确提及(或者我找不到),但至少在一个地方提到了省略号#0实际上在CPython中使用

它用于表示Python中的无限数据结构。我在玩列表时偶然发现了这个符号。

查看这个问题了解更多信息。

__getitem__最小...自定义类中的示例

当神奇语法...在自定义类中传递给[]时,__getitem__()收到一个Ellipsis类对象。

然后类可以对这个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内置的list类选择给它一个范围的语义,当然,任何理智的使用也应该如此。

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

在Python 3.5.2和2.7.12中测试。

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

示例1:

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

示例2:

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

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

正如@no z和@phoPhoenix所提到的-您确实可以在存根文件中使用它。

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

有关如何使用此省略号的更多信息和示例可以在此处找到https://www.python.org/dev/peps/pep-0484/#stub-files

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

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

可能的用途包括:

  • 作为None是有效选项的地方的默认值
  • 作为您尚未实现的函数的内容

这是相当的。

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

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

省略号

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

typer中,...用于创建必需的参数:Argument类需要一个默认值,如果您传递...,如果用户不传递特定参数,它将抱怨。

如果Ellipsis不存在,您可以使用None来表示相同的值,但这将消除表达None默认值的机会,以防在您的程序中有任何意义。

FastAPI使用省略号来创建所需的参数。https://fastapi.tiangolo.com/tutorial/query-params-str-validations/

对于任何在大量使用Pydantic的代码库中工作的人来说,这也是Pydantic指示一个必需但可以设置为None的字段的方式,他们称之为“必填项”。这就是为什么它们最终也被用于FastAPI。