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
这也适用于泛型类型。例如,您可以使用None
inGenerator[int, None, None]
指示生成器不接受或不返回值。
即使 PEP 484 建议这None
意味着type(None)
,您也不应该明确使用后一种形式。类型提示规范不包括任何形式的type(...)
. 这在技术上是一个运行时表达式,它的支持完全取决于类型检查器。mypy 项目正在考虑是否删除对 484 的支持并将type(None)
其从 484 中删除。
或者也许我们应该更新 PEP 484 以不建议它type(None)
作为一种类型是有效的,并且None
是唯一正确的拼写?应该有一种——最好只有一种——明显的方法来做到这一点等。
--- JukkaL,2018 年 5 月 18 日