739

在闲逛命名空间时,我注意到一个看起来很奇怪的对象,称为Ellipsis,它似乎并没有什么特别之处,也没有做任何特别的事情,但它是一个全局可用的内置函数。

经过搜索,我发现它被 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
4

14 回答 14

744

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

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

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

它的解释完全取决于实现__getitem__函数并Ellipsis在那里看到对象的任何东西,但它的主要(和预期)用途是在numpy第三方库中,它添加了多维数组类型。由于有多个维度,切片变得比仅仅一个开始和停止索引更复杂;能够在多个维度上切片也很有用。例如,给定一个 4x4 数组,左上角区域将由 slice 定义[: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 数组,与 4da[...,0]相同a[:,:,0],对于 4d,a[:,:,:,0]同样,a[0,...,0]a[0,:,:,0](但中间有许多冒号构成完整数字数组中的维数)。

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

>>> ...
Ellipsis

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

于 2009-04-21T16:26:07.937 回答
333

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

def will_do_something():
    ...

不是魔术。可以使用任何表达式代替...,例如:

def will_do_something():
    1

(不能使用“sanctioned”这个词,但我可以说这种用法并没有被 Guido完全拒绝。)

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

于 2011-05-31T14:39:41.713 回答
109

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

示例 1:

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

示例 2:

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

def partial(func: Callable[..., str], *args) -> Callable[..., str]:
    # Body
于 2016-05-28T13:08:47.027 回答
60

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

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

可能的用途可能包括:

  • None作为有效选项的地方的默认值
  • 作为您尚未实现的功能的内容
于 2018-06-02T21:08:15.787 回答
48

您还可以在指定预期的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
于 2011-05-31T14:47:58.483 回答
38

Python 文档

此对象通常由切片使用(请参阅切片)。它不支持特殊操作。只有一个省略号对象,名为 Ellipsis(内置名称)。type(Ellipsis)()产生省略号单例。

它写成Ellipsisor ...

于 2009-04-21T11:30:30.173 回答
24

__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 中测试。

于 2015-10-12T18:03:20.377 回答
16

对于在大量使用 Pydantic 的代码库中工作而获得此答案的任何人:这也是 Pydantic 指示一个必需但可以设置为的字段的方式None,他们将其称为“必需的可选字段”。这也是为什么它们最终也被用于 FastAPI 的原因。

于 2021-03-17T02:37:01.753 回答
14

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

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

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

于 2009-04-21T11:24:33.900 回答
13

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

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

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

于 2018-01-23T11:11:19.090 回答
3

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

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

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

于 2013-07-20T15:42:41.807 回答
3

这是等价的。

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

...是内部定义的常数built-in constants

省略

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

于 2019-05-27T14:17:43.577 回答
2

typer ...中用于创建必需的参数:Argument该类需要一个默认值,如果您传递了...它,如果用户没有传递特定的参数,它会报错。

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

于 2020-10-03T06:29:54.643 回答
0

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

于 2021-01-29T22:58:30.980 回答