省略号对象有什么作用?

864 投票
14 回答
304094 浏览
提问于 2025-04-15 11:11

在随意浏览命名空间的时候,我发现了一个奇怪的东西,叫做 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

14 个回答

133

从Python 3.5开始,以及根据PEP484的规定,三个点(...)这个符号被用来告诉静态类型检查器某些类型的意思,特别是在使用typing模块的时候。

例子1:

可以用一种类型加上三个点来表示任意长度的同类元组,比如说Tuple[int, ...]

例子2:

你可以在不具体说明调用签名的情况下,声明一个可调用对象的返回类型,只需要用三个点来代替参数列表:

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

在Python 3中,你可以使用省略号这个符号...作为一个“占位符”,表示那些还没有写好的代码:

def will_do_something():
    ...

不是魔法;实际上任何表达式都可以替代...,比如:

def will_do_something():
    1

(虽然不能用“被批准”这个词,但我可以说这种用法并没有被完全拒绝,这是Guido的看法。)

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

845

这个内容是最近在另一个问题中提到的。我会详细解释一下我在那里的回答

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]])

进一步说,Ellipsis在这里用来表示未指定的数组维度的占位符。可以把它想象成在它所在的地方表示所有维度的完整切片[:],所以对于一个三维数组,a[..., 0]a[:, :, 0]是一样的;对于四维数组,a[:, :, :, 0]也是类似的,a[0, ..., 0]等同于a[0, :, :, 0](中间有多少个冒号就表示数组的维度数)。

有趣的是,在python3中,Ellipsis字面量(...)可以在切片语法之外使用,所以你实际上可以写:

>>> ...
Ellipsis

编辑:Ellipsis在标准库的typing模块中也有使用:例如,Callable[..., int]表示一个返回int的可调用对象,而不需要指定具体的参数;或者tuple[str, ...]表示一个可变长度的字符串元组。

撰写回答