Python void返回类型注释

在python中3。X,通常使用函数的返回类型注释,例如:

def foo() -> str:
return "bar"

空格的正确注释是什么?类型?

我在考虑三个选择:

    <李> def foo() -> None:
    • 不符合逻辑的IMO,因为None不是类型,
    <李> def foo() -> type(None):
    • 使用我所知道的最好的语法来获取NoneType
    <李> def foo():
    • 省略显式返回类型信息。

第二个选项。对我来说似乎是最合乎逻辑的,但我已经见过一些1的例子。

109922 次浏览

这直接来自PEP 484—类型提示文档:

当在类型提示中使用时,表达式None被认为等同于type(None)

并且,正如你所看到的,大多数示例使用None作为返回类型。

TLDR: void返回类型注释的习惯等效物是-> None

def foo() -> None:
...

这就匹配了一个没有return或只有一个空return的函数为None的结果。

def void_func():  # unannotated void function
pass


print(void_func())  # None

省略返回类型意味着没有返回值。根据PEP 484:

对于checked函数,参数和返回类型的默认注释是Any

这意味着该值被认为是动态类型和静态支持任何操作。这实际上是void的相反含义。


Python中的类型提示并不严格要求实际类型。例如,注释可以使用类型名字符串:Union[str, int]Union[str, 'int']'Union[str, int]'和各种变体是等效的。

类似地,类型注释None被认为是意味着 "属于NoneType"。这可以在其他情况下使用,以及返回类型,尽管你会经常看到它作为一个返回类型注释:

bar : None


def foo(baz: None) -> None:
return None

这也适用于泛型类型。例如,你可以在Generator[int, None, None]中使用None来表示生成器不接受或返回值。


尽管PEP 484建议None表示type(None),但您不应该显式地使用后一种形式。类型提示规范包含任何形式的type(...)。这在技术上是一个运行时表达式,它的支持完全取决于类型检查器。mypy项目是考虑是否移除支撑type(None),并将其从484中删除。

或者我们应该更新PEP 484,不建议type(None)是有效的类型,而None是唯一正确的拼写?应该有一种——最好只有一种——明显的方法来做这件事。

——朱卡尔,2018年5月18日