在空闲地浏览名称空间时,我注意到一个名为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

当前回答

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

椭圆是一种可以以切片表示法显示的对象。例如:

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

它的解释完全取决于实现__getitem_函数并在那里看到Ellipsis对象,但它的主要(和预期)用途是numpy第三方库,它添加了一个多维数组类型。由于有不止一个维度,切片变得比仅仅是开始和停止索引更复杂;能够在多个维度上进行切片也是有用的。例如,给定一个4×4阵列,左上区域将由切片[: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数组,[…,0]与[:,:,0]相同,对于4d,a[:,,:,:。

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

>>> ...
Ellipsis

EDIT:Ellipsis也用于标准库类型模块:例如Callable[…,int]表示返回int而不指定签名的可调用对象,或tuple[str,…]表示字符串的可变长度同质元组。

其他回答

__getitem_最小。。。自定义类中的示例

当神奇的语法。。。在自定义类中传递给[],__getitem__()接收Ellipse类对象。

然后,类可以对这个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内置列表类选择为其提供范围的语义,当然,任何合理的用法都应该如此。

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

在Python 3.5.2和2.7.12中测试。

对于在Pydantic使用量很大的代码库中工作而得出这个答案的人来说:这也是Pydantic表示需要但可以设置为None的字段的方式,他们称之为“必需的可选字段”。这就是为什么它们最终也被用于FastAPI的原因。

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

椭圆是一种可以以切片表示法显示的对象。例如:

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

它的解释完全取决于实现__getitem_函数并在那里看到Ellipsis对象,但它的主要(和预期)用途是numpy第三方库,它添加了一个多维数组类型。由于有不止一个维度,切片变得比仅仅是开始和停止索引更复杂;能够在多个维度上进行切片也是有用的。例如,给定一个4×4阵列,左上区域将由切片[: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数组,[…,0]与[:,:,0]相同,对于4d,a[:,,:,:。

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

>>> ...
Ellipsis

EDIT:Ellipsis也用于标准库类型模块:例如Callable[…,int]表示返回int而不指定签名的可调用对象,或tuple[str,…]表示字符串的可变长度同质元组。

在打字机中。。。用于创建必需的参数:Argument类需要默认值,如果传递。。。如果用户没有传递特定的参数,它将发出抱怨。

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

这是等效的。

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

…是在内置常量中定义的常量。

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