Skip to main content

【...】省略号的使用

省略号(...)在Python有着广泛的应用,尤其是一些底层代码中,经常能看到大量的省略号(...)。如下图所示就是type这个类的底层代码,可以看到非常多的省略号(...)。这些省略号(...)是什么意思?又有哪些用法呢?本文试图分析一二。

imgtype类中有大量的省略号(...)

1. 省略号(...)是什么?

省略号(...)的底层代码很简单,如下所示。@final装饰器的意思是该类不允许被继承。

# Actually the type of Ellipsis is <type 'ellipsis'>, but since it's
# not exposed anywhere under that name, we make it private here.
@final
class ellipsis: ...

Ellipsis: ellipsis

而如下的代码的输出结果说明:Ellipsis就是省略号(...),省略号(...)就是Ellipsis而Ellipsis是ellipsis类的唯一实例(singleton object),这种唯一实例的模式也称为单例模式(singleton pattern)[1]

print(type(...))            # output: <class 'ellipsis'>
print(Ellipsis == ...) # True
print(...) # Ellipsis

2. 省略号(...)在Python中的三种用法

2.1 类型提示

关于Python中的类型提示(type hints)详见【Python】作为动态语言,Python中的“类型声明”有什么用?。省略号(...)在类型提示中经常被使用,如

from typing import Callable, Tuple

Callable[..., int] # 输入参数随意,返回值为int
Tuple[int, ...] # int组成的元组

class Model(BaseModel):
a: Optional[int]
b: Optional[int] = ...
c: Optional[int] = Field(...)

2.2 函数内部,相当于pass

以下两个写法没有太大区别

def foo1(): pass
def foo2(): ...

2.3 numpy中的索引

import numpy as np

arr = np.random.random((2,2,2))
print(arr)
print(arr[..., 0, 0])

总结

  • 在函数内直接使用,与pass等价
  • 在类型定义中使用,与None等价
  • 在索引中使用,相当于一个占位符