Python Ellipsis对象有什么作用?

时间:2009-04-21 11:21:13

标签: python 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

14 个答案:

答案 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 documentation

  

此对象由扩展切片使用   表示法(请参阅 Python Reference Manual )。它没有特别的支持   操作。只有一个   省略号对象,名为Ellipsis(a   内置名称)。

答案 5 :(得分:14)

总结其他人所说的内容,从Python 3开始,省略号本质上是另一个类似于f: 2 - Thread[main,5,main] 的单例常量,但没有特定的用途。现有用途包括:

  • 在切片语法中表示剩余维度中的完整切片
  • 在类型提示中仅指示部分类型(NoneCallable[..., int]
  • 在类型存根文件中指示存在默认值而未指定

可能的用途包括:

  • 作为Tuple[str, ...]是有效选项的地方的默认值
  • 作为尚未实施的功能的内容

答案 6 :(得分:11)

你可以在numpy已经完成的自定义切片情况下自己使用省略号,但它在任何内置类中都没有用。

我不知道它是否专门用于numpy,但我当然没有看到它用于其他地方。

另请参阅:How do you use the ellipsis slicing syntax in Python?

答案 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: ...

可以在https://www.python.org/dev/peps/pep-0484/#stub-files

中找到有关如何使用此省略号的更多信息和示例

答案 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 的原因。