Python Ellipsis对象有什么作用?

爷,独闯天下 提交于 2020-02-26 01:17:05

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

经过搜索,我发现Numpy和Scipy在切片语法的某些晦涩变体中使用了它……但是几乎没有其他东西。

是否将此对象添加到专门支持Numpy + Scipy的语言中? Ellipsis是否有任何一般意义或用途?

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

#1楼

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

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

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


#2楼

__getitem__ minimal ...自定义类中的示例

当魔术语法...在自定义类中传递给[]时, __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中测试。


#3楼

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

范例1:

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

范例2:

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

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

#4楼

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

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

有关如何使用此省略号的更多信息和示例,请参见https://www.python.org/dev/peps/pep-0484/#stub-files


#5楼

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

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

可能的用途包括:

  • 作为None有效选项的地方的默认值
  • 作为尚未实现的功能的内容
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!