Python void 返回类型注释

问题描述 投票:0回答:2

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

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

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

我正在考虑 3 个选择:

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

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

python annotations type-hinting python-typing nonetype
2个回答
309
投票

使用选项 1 可以简化并遵守规范。

def foo() -> None

选项 1 和 2 与 PEP 484 -- 类型提示“相同”,...

在类型提示中使用时,表达式

None
被视为等同于
type(None)

但是类型提示规范不使用

type(...)

这就是为什么大多数示例使用

None
作为返回类型。


144
投票

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
是唯一正确的拼写?应该有一种——最好只有一种——明显的方法来做到这一点等等。

--- JukkaL,2018 年 5 月 18 日

© www.soinside.com 2019 - 2024. All rights reserved.