在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作为返回类型。