Python Ellipsis对象有什么作用?

Sal*_*ley 472 python ellipsis

在闲置浏览命名空间的同时,我注意到一个名为" 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
Run Code Online (Sandbox Code Playgroud)

Bri*_*ian 495

最近出现了另一个问题.我将从那里详细说明我的答案:

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

myList[1:2, ..., 0]
Run Code Online (Sandbox Code Playgroud)

它的解释完全取决于实现__getitem__函数和查看Ellipsis对象的任何东西,但它的主要(和预期)用途是在数字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]])
Run Code Online (Sandbox Code Playgroud)

进一步扩展,省略号用于指示未指定的其余数组维度的占位符.可以把它想象成指示[:]它所放置的间隙中所有尺寸的完整切片,因此对于3d数组,与4d a[...,0]相同,同样地,是(中间有许多冒号组成全部数字)数组中的维度).a[:,:,0]a[:,:,:,0]a[0,...,0]a[0,:,:,0]

有趣的是,在python3中,Ellipsis literal(...)可以在切片语法之外使用,因此您可以实际编写:

>>> ...
Ellipsis
Run Code Online (Sandbox Code Playgroud)

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

  • 呸骗子.你使用'省略号'错了.显然你应该像这样使用它:`a [省略号,0]`,这些都不是傻傻的```. (46认同)
  • 它也用于存根文件中的PEP484类型提示 (19认同)
  • 以防万一有人好奇:它也用在标准库的“ typing”模块中:例如,“ Callable [...,int]”表示可返回未指定签名的“ int”的可调用对象,或者“ Tuple [str” ,...]`表示字符串的可变长度同构元组。 (11认同)
  • @ArtOfWarfare 你是完全正确的,这是来自于口头说“省略号”而不是在句子之间逐渐减弱的人。 (5认同)
  • 仅供参考,FastAPI框架(适用于python 3.6+)也(现在)使用它。https://fastapi.tiangolo.com/tutorial/query-params-str-validations/ (4认同)
  • 我找到了这个。当您在列表中进行自引用(循环引用)时,似乎会出现:`a = [1, 2]; a[0] = a; print(a)` 给出 `[[...], 2]`。这是相同的东西还是不同的用途? (2认同)
  • 作为另一个参考,您可以查看标准 `socket` 模块,您将看到诸如 `def recv(self, bufsize: int, flags: int = ...) -> bytes: ...` 等定义,其中 `...` 用于函数体。我知道这应该在 C 库上进行系统调用,但我不知道“...”在这里意味着什么。 (2认同)
  • 就是一个“随便”。您知道标志有一个整数默认值并且有一个主体,但您不知道它是什么,因为它是特定于操作系统的。实际的“socket”当然是用 C 实现的,您不想向其中添加键入信息,这样做太乏味了。 (2认同)

tzo*_*zot 185

在Python 3中,您可以将Ellipsis文字...用作代码的"nop"占位符:

def will_do_something():
    ...
Run Code Online (Sandbox Code Playgroud)

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

def will_do_something():
    1
Run Code Online (Sandbox Code Playgroud)

(不能使用"制裁"这个词,但我可以说这种用法并没有被Guido 彻底拒绝.)

  • 在一个半惯例中,我经常看到`````用于人们想要表示他们打算稍后填写的东西('todo'空块)和``pass``表示意图有一个块没有代码. (166认同)
  • Python也有'NotImplemented`文字,当你希望你的不完整函数返回有意义的东西(而不是像你的例子中的'None`)时,它很有用.(另一个用例:[实现算术运算](https://docs.python.org/3/library/numbers.html#implementing-the-arithmetic-operations)) (26认同)
  • @zvyn那不是文字.这只是一个名字.例如`NotImplemented ='something_else'`是有效的python,但``='something_else'`是语法错误. (12认同)
  • @zvyn`NotImplemented`不能替代`None`。它的用法相当狭窄。参见文档[here](https://docs.python.org/3/library/constants.html) (5认同)
  • @zvyn导入该模块时发生异常怎么办?:) (4认同)
  • 在这种情况下,您还可以使用文档字符串 - 似乎是更好的做法。 (3认同)
  • `raise NotImplemented` 是 py2 中的一个东西 (2认同)
  • 并且 `raise NotImplementedError` 仍然是 py3 中的一个问题 (2认同)

pho*_*nix 56

从Python 3.5和PEP484开始,当使用输入模块时,文字省略号用于表示静态类型检查器的某些类型.

例1:

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

例2:

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

def partial(func: Callable[..., str], *args) -> Callable[..., str]:
    # Body
Run Code Online (Sandbox Code Playgroud)


Chi*_*ggs 45

在指定预期的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
Run Code Online (Sandbox Code Playgroud)

  • 但这实际上是否涉及Ellipsis对象?它不只是doctest解析器/匹配器的一个功能吗? (8认同)
  • @akaihola 我会说它确实如此,如 [doctest.ELLIPSIS](https://docs.python.org/2/library/doctest.html#doctest.ELLIPSIS) 所述。我希望`...` 的大多数(如果不是全部)使用都是语法上的,并且不要`使用`实际的 Ellipsis 对象。它真的只是一个适应性概念的方便名称吗? (2认同)

Sim*_*hke 34

Python文档:

扩展切片表示法使用此对象(请参阅Python参考手册).它不支持任何特殊操作.只有一个省略号对象,名为Ellipsis(内置名称).


tyk*_*kom 30

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

  • 是的,这是我在自己的代码中需要的一个用例;下次需要的时候会使用它。 (3认同)

Mat*_*eld 18

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

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

可能的用途包括:

  • 作为None有效选项的地方的默认值
  • 作为函数的内容,您还没有实现


Cir*_*四事件 13

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

...[]当你使用"神奇的" __getitem__()语法时,它将作为单例类魔术值传递给你.

然后,班级可以随心所欲地做任何事情.

例:

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)
Run Code Online (Sandbox Code Playgroud)

Python内置Ellipsis类选择为其提供范围的语义,当然也应该使用它的任何合理用法.

就个人而言,我只是在我的API中远离它,并创建一个单独的,更明确的方法.

  • 使用 [-O](https://docs.python.org/3/using/cmdline.html#cmdoption-o) 参数运行此命令,您的代码将始终运行 ;D (2认同)

syk*_*ora 12

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

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

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


hen*_*ack 11

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

class Foo:
    bar: Any = ...
    def __init__(self, name: str=...) -> None: ...
Run Code Online (Sandbox Code Playgroud)

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

  • 好的,那么当我实际实例化该类并且省略号代码运行时会发生什么? (2认同)

pro*_*sti 5

这是等价的。

\n
l=[..., 1,2,3]\nl=[Ellipsis, 1,2,3]\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
\n

省略

\n

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

\n
\n