在python 3.x中,常见的是使用函数的返回类型注释,例如:
def foo() -> str:
return "bar"
“void”类型的正确注释是什么?
我正在考虑 3 个选择:
def foo() -> None:
None
不是一种类型,def foo() -> type(None):
NoneType
,def foo():
选项 2. 对我来说似乎最符合逻辑,但我已经看到了 1 的一些实例。
使用选项 1 可以简化并遵守规范。
def foo() -> None
选项 1 和 2 与 PEP 484 -- 类型提示“相同”,...
在类型提示中使用时,表达式
被视为等同于None
。type(None)
但是类型提示规范不使用
type(...)
。
这就是为什么大多数示例使用
None
作为返回类型。
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
中使用 Generator[int, None, None]
来指示生成器不接受或返回值。
尽管 PEP 484 建议
None
表示 type(None)
,但您不应该 明确使用后一种形式。类型提示规范不包括任何形式的type(...)
。从技术上讲,这是一个运行时表达式,其支持完全取决于类型检查器。 mypy 项目正在考虑是否删除对 type(None)
的支持,并将其从 484 中删除。
或者也许我们应该更新 PEP 484,不建议
作为有效类型,并且type(None)
是唯一正确的拼写?应该有一种——最好只有一种——明显的方法来做到这一点等等。None