看这样一段代码:
class CustomException(Exception):
...
会不会认为它是一段伪代码?因为在 Python 中,一般会使用关键词 pass
来填充尚未实现的对象。
然而,上面的代码真的能运行,它就是一段 Python 代码,不是伪代码。
在 Python 中,省略号是类似于 True
、False
那样的内置常量。
>>> True
True
>>> Ellipsis
Ellipsis
>>> ...
Ellipsis
准确地说, Ellipsis
是内置常量,…
(三个半角的点)是相应的字面量。你也可以在CPython 中的 Lib/token.py
(https://github.com/python/cpython/blob/3.9/Lib/token.py#L58)中看到它的定义。
# previous code in token.py
ELLIPSIS = 52
# subsequent code in token.py
在 Python 的官方文档(https://docs.python.org/3/library/constants.html#Ellipsis)中显示,省略号是一个特殊值,主要用于字定义的容器数据类型中,与扩展切片语法结合使用。然而,我没有找到一个体现这种说法的案例,包括第三方包 NumPy 中的切片。根据我的理解,它的意思就是“随意”。如果你有一个特定的函数或类,并且想在其中实现一个特殊的特性、查找一个非文字对象,省略号对象可能正合适。
自己编一个示例,假设有一个函数,它没有参数并返回一个元组:
def return_tuple() -> tuple:
pass
如果想让函数返回更多对象,还可以指定元组包含什么。例如,它可以返回由两个整数组成的一个元组:
def return_tuple() -> tuple[int, int]:
pass
注意,在 Python 3.9 之前,不支持 tuple[int, int]
形式的类型注释。在较旧版本的 Python 中,需要用 typing
模块中的 Tuple
或导入 __future__.annotations
。
如果一个整数元组可以是大于零的任意长度,将如何注释这个元组?这时候就可以使用省略号:
def return_tuple() -> tuple[int, ...]:
pass
此外,如果使用 typing
模块中的 Callable
,用以说明返回的是一个可调用的对象,可以通过省略号表示若干个未定的参数列表,如:
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 基础图书):
def my_function():
pass
这里的关键 pass
,其实也可以不用,随便写一个表达式就可以,反正写这个函数的目的并不是真正要使用它,比如用数字 1
替代 pass
。
def my_function():
1
当然也可以用省略号。
def my_function():
...
但是要注意,可能有时候省略号会引发 NotImplemented
异常,这说明它并不适用于所有情况。所以,一般情况下,可以用省略号替代 pass
,但我不推荐这么做,还是最好使用 pass
。
总结一下,省略号可以用在类型注释、替代 pass
等方面,但是在实际的使用中,也不能滥用。
参考文献
https://florian-dahlitz.de/articles/what-is-pythons-ellipsis-object#introduction