193

在 python 3.x 中,通常使用函数的返回类型注解,例如:

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

“void”类型的正确注释是什么?

我正在考虑 3 个选项:

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

选项 2. 对我来说似乎是最合乎逻辑的,但我已经看到了 1 的一些实例。

4

2 回答 2

208

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

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

而且,正如您所看到的,大多数示例都None用作返回类型。

于 2016-04-22T15:10:12.763 回答
84

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

这也适用于泛型类型。例如,您可以使用NoneinGenerator[int, None, None]指示生成器不接受或不返回值。


即使 PEP 484 建议这None意味着type(None),您也不应该明确使用后一种形式。类型提示规范不包括任何形式的type(...). 这在技术上是一个运行时表达式,它的支持完全取决于类型检查器。mypy 项目正在考虑是否删除对 484 的支持并将type(None)其从 484 中删除。

或者也许我们应该更新 PEP 484 以不建议它type(None)作为一种类型是有效的,并且None是唯一正确的拼写?应该有一种——最好只有一种——明显的方法来做到这一点等。

--- JukkaL,2018 年 5 月 18 日

于 2019-05-20T13:17:53.613 回答