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