每当我看到任何Python内置函数时,我总是会找到一个带有
...
的函数,例如:
def append(self, __object: _T) -> None: ...
但是,我找不到
...
的含义。是什么意思?
...
是名为 Elipsis
的对象的文字,该对象过去仅存在于特殊类型的切片中(例如在 numpy
中)。它是一个单例对象,如 None
和 NotImplemented
。
因为
...
意味着您在正常写作中省略或遗漏了某些内容,所以有时在 Python 代码中,文字也会用于相同的目的。如果您正在教某人如何编写函数,您可能会向他们展示像这样的 def
语句:
def foo(bar):
...
这里的
...
没有做任何有用的事情,它只是显示你遗漏了函数体的地方。更传统的什么都不做的方式是 pass
语句,但是 ...
似乎正在接管,也许特别是当函数 should 有一个主体时,你只是没有显示它。
这种用法在类型提示的用户中变得很常见。当第三方库的作者没有使用类型提示时,通常需要编写“存根”函数来显示第三方库中编写的函数所需的参数类型。存根不需要完整的函数体,因此使用
...
来代替。
由于类型提示是作为 Python 的可选功能引入的,因此解释器在标准库的自己的代码中不包含类型提示,因此必须为内置函数和标准的所有函数和方法创建存根文件图书馆。存根格式化的许多功能已在各种文档中重复使用,因为它简洁地显示了函数所需的类型。
只有一种特定情况下
...
在类型提示中具有特殊含义,那就是 typing.Callable
。您可以提示 Callable[..., int]
引用一个具有未指定参数且返回整数的可调用对象的值。这样做只是因为正确提示所有可调用参数通常很尴尬,特别是对于可以通过多种不同方式调用的函数。有人讨论过添加新语法来更直接地提示 Callable
,但尚未确定(PEP 677 提议用 (int, str) -> bool
来表示 Callable[[int, str], bool]
,但去年 12 月被拒绝)。