介绍
在 Python 中,... 被称为 Ellipsis(省略号)对象。它是一个单例对象(就像 None、True、False 一样,全局只有一个实例)。
1. 作为占位符 (常用)
这是最常见的用法。当你写代码时还没想好具体实现,或者在定义抽象方法时,可以用 ... 代替 pass。
def my_function():
... # 比 pass 看起来更明确地表示“这里以后要写代码”
class MyInterface:
def do_something(self):
... # 抽象方法占位
2. 作为函数的默认参数值 (常用)
因为 ... 是单例对象,所以可以用 is 来精确判断,非常适合用来区分“用户没传参数”和“用户传了 None”的情况。
def connect(host, port=None, timeout=...):
if timeout is ...:
# 用户没传 timeout,使用内部默认逻辑
timeout = 30
elif timeout is None:
# 用户明确传了 None,表示无限等待
timeout = float('inf')
else:
timeout = timeout
3. NumPy 数组索引 (较常用)
NumPy中,... 是个神器,代表“选中当前维度剩下的所有维度”。
import numpy as np
arr = np.zeros((3, 4, 5))
# 下面这两行是完全等价的:
print(arr[0, ...]) # 选中第 0 个,后面所有维度都保留
print(arr[0, :, :]) # 传统写法
这在处理高维张量(比如深度学习中的图像/视频数据)时能省下大量写 : 的麻烦。
4. 类型提示 (Type Hinting)
在 typing 模块中,... 用来表示可变长度的元组或任意参数。
from typing import Callable, Tuple
# 表示一个接受任意数量、任意类型参数,并返回 int 的函数
MyFunc = Callable[..., int]
# 表示一个包含任意数量 int 的元组
MyTuple = Tuple[int, ...]
5. 自定义类中的切片 (Slicing)
当你用 obj[...] 时,Python 会把 ... 作为参数传给 __getitem__。
class MyGrid:
def __getitem__(self, key):
if key is ...:
return "你选中了整个网格!"
return f"你选中了: {key}"
grid = MyGrid()
print(grid[...]) # 输出: 你选中了整个网格!
总结
- 写普通业务逻辑占位:用
pass或...都可以,...视觉上更醒目。 - NumPy / Pandas:用
...代替连续的:。 - 写框架 / 库:用
...做默认参数或切片语法糖。 - 千万不要 把
...当作True或False来用,虽然它在布尔上下文中是True,但这属于滥用。