TLDR:void返回类型注释的惯用等价物是-> None.
def foo() -> None:
...
这与没有return或仅裸的函数return计算为None.
def void_func(): # unannotated void function
pass
print(void_func()) # None
省略返回类型并不意味着没有返回值。根据PEP 484:
对于检查函数,参数和返回类型的默认注释是Any.
这意味着该值被认为是动态类型的并且静态支持任何操作。这实际上是相反的意思void。
Python 中的类型提示并不严格要求实际类型。例如,注释可以使用类型名称的字符串:Union[str, int], Union[str, 'int'],'Union[str, int]'并且各种变体是等效的。
类似地,类型注释None被认为意味着“是NoneType”。这可以用于其他情况以及返回类型,尽管您最常将其视为返回类型注释:
bar : None
def foo(baz: None) -> None:
return None
这也适用于泛型类型。例如,您可以使用NoneinGenerator[int, None, None]指示生成器不接受或不返回值。
即使 PEP 484 建议这None意味着type(None),您也不应该明确使用后一种形式。类型提示规范不包括任何形式的type(...). 这在技术上是一个运行时表达式,它的支持完全取决于类型检查器。mypy 项目正在考虑是否删除对 484 的支持并将type(None)其从 484 中删除。
或者也许我们应该更新 PEP 484 以不建议它type(None)作为一种类型是有效的,并且None是唯一正确的拼写?应该有一种——最好只有一种——明显的方法来做到这一点等。
--- JukkaL,2018 年 5 月 18 日