Python ...Ellipsis省略号的用法

介绍

在 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,但这属于滥用。

原文出处:/show_1GW3qnVbsdsv.html