老齐教室

Python 中的省略号

看这样一段代码:

1
2
class CustomException(Exception):
...

会不会认为它是一段伪代码?因为在 Python 中,一般会使用关键词 pass 来填充尚未实现的对象。

然而,上面的代码真的能运行,它就是一段 Python 代码,不是伪代码。

在 Python 中,省略号是类似于 TrueFalse 那样的内置常量。

1
2
3
4
5
6
>>> True
True
>>> Ellipsis
Ellipsis
>>> ...
Ellipsis

准确地说, Ellipsis 是内置常量, (三个半角的点)是相应的字面量。 你也可以在CPython 中的 Lib/token.pyhttps://github.com/python/cpython/blob/3.9/Lib/token.py#L58)中看到它的定义。

1
2
3
# previous code in token.py
ELLIPSIS = 52
# subsequent code in token.py

在 Python 的官方文档(https://docs.python.org/3/library/constants.html#Ellipsis)中显示,省略号是一个特殊值,主要用于字定义的容器数据类型中,与扩展切片语法结合使用。然而,我没有找到一个体现这种说法的案例,包括第三方包 NumPy 中的切片。根据我的理解,它的意思就是“随意”。如果你有一个特定的函数或类,并且想在其中实现一个特殊的特性、查找一个非文字对象,省略号对象可能正合适。

自己编一个示例,假设有一个函数,它没有参数并返回一个元组:

1
2
def return_tuple() -> tuple:
pass

如果想让函数返回更多对象,还可以指定元组包含什么。例如,它可以返回由两个整数组成的一个元组:

1
2
def return_tuple() -> tuple[int, int]:
pass

注意,在 Python 3.9 之前,不支持 tuple[int, int] 形式的类型注释。在较旧版本的 Python 中,需要用 typing 模块中的 Tuple 或导入 __future__.annotations

如果一个整数元组可以是大于零的任意长度,将如何注释这个元组?这时候就可以使用省略号:

1
2
def return_tuple() -> tuple[int, ...]:
pass

此外,如果使用 typing 模块中的 Callable ,用以说明返回的是一个可调用的对象,可以通过省略号表示若干个未定的参数列表,如:

1
2
3
4
from typing import Callable

def return_callable() -> Callable[..., int]:
pass

此处的 Callable[..., int] 即表示此函数要返回一个可调用的对象,此对象为 int 类型,但无需指定调用标签。详细内容参阅:https://docs.python.org/3/library/typing.html

以上演示了 Python 代码中省略号的第一种应用场景,可以用于类或函数返回值类型标记上。

下面要演示的是第二种应用场景,可以用作 pass 关键字的临时替身。

我们可以定义这样一个函数(参阅 www.itdiffer.com 中列出的任何一本 Python 基础图书):

1
2
def my_function():
pass

这里的关键 pass ,其实也可以不用,随便写一个表达式就可以,反正写这个函数的目的并不是真正要使用它,比如用数字 1 替代 pass

1
2
def my_function():
1

当然也可以用省略号。

1
2
def my_function():
...

但是要注意,可能有时候省略号会引发 NotImplemented 异常,这说明它并不适用于所有情况。所以,一般情况下,可以用省略号替代 pass ,但我不推荐这么做,还是最好使用 pass

总结一下,省略号可以用在类型注释、替代 pass 等方面,但是在实际的使用中,也不能滥用。

参考文献

https://florian-dahlitz.de/articles/what-is-pythons-ellipsis-object#introduction

使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

关注微信公众号,读文章、听课程,提升技能