在python中3。X,通常使用函数的返回类型注释,例如:
def foo() -> str:
return "bar"
“void”类型的正确注释是什么?
我在考虑三个选择:
def foo() ->无。 不符合逻辑,因为None不是一个类型, def foo() -> type(None): 使用我所知道的获取NoneType的最佳语法, def foo (): 省略显式返回类型信息。
第二个选项。对我来说似乎是最合乎逻辑的,但我已经见过一些1的例子。
在python中3。X,通常使用函数的返回类型注释,例如:
def foo() -> str:
return "bar"
“void”类型的正确注释是什么?
我在考虑三个选择:
def foo() ->无。 不符合逻辑,因为None不是一个类型, def foo() -> type(None): 使用我所知道的获取NoneType的最佳语法, def foo (): 省略显式返回类型信息。
第二个选项。对我来说似乎是最合乎逻辑的,但我已经见过一些1的例子。
当前回答
这是直接来自PEP 484—类型提示文档:
当在类型提示中使用时,表达式None被认为等同于type(None)。
并且,正如您所看到的,大多数示例使用None作为返回类型。
其他回答
TLDR:等效于void返回类型注释的习惯用法是->无。
def foo() -> None:
...
这与没有返回值或只有裸返回值的函数的值为None相匹配。
def void_func(): # unannotated void function
pass
print(void_func()) # None
省略返回类型并不意味着没有返回值。根据PEP 484:
对于checked函数,参数和返回类型的默认注释是Any。
这意味着该值被认为是动态类型的,并且静态支持任何操作。这实际上是虚空的相反意思。
Python中的类型提示并不严格要求实际类型。例如,注释可以使用类型名称的字符串:Union[str, int], Union[str, 'int'], 'Union[str, int]'和各种变体是等效的。
类似地,类型注释None被认为是“是非类型的”。这可以在其他情况下使用,以及返回类型,尽管你会经常看到它作为一个返回类型注释:
bar : None
def foo(baz: None) -> None:
return None
这也适用于泛型类型。例如,您可以在Generator[int, None, None]中使用None表示生成器不接受或不返回值。
尽管PEP 484建议None表示类型(None),但不应该显式地使用后一种形式。类型提示规范不包括任何形式的类型(…)。这在技术上是一个运行时表达式,它的支持完全取决于类型检查器。mypy项目正在考虑是否删除对类型(None)的支持,并将其从484中删除。
或者我们应该更新PEP 484,不建议type(None)是有效的类型,并且None是唯一正确的拼写?应该有一种——最好只有一种——明显的方法来做这件事。 ——JukkaL, 2018年5月18日
这是直接来自PEP 484—类型提示文档:
当在类型提示中使用时,表达式None被认为等同于type(None)。
并且,正如您所看到的,大多数示例使用None作为返回类型。