Python void返回类型批注

2024-04-23 20:13:19 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

我在考虑三个选择:

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

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


Tags: 函数none类型returnfoodeftype语法
2条回答

TLDR:avoid返回类型注释的惯用等价物是-> None

def foo() -> None:
    pass

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)considering to remove support,并将其从484中移除。

Or maybe we should update PEP 484 to not suggest that type(None) is valid as a type, and None is the only correct spelling? There should one -- and preferably only one -- obvious way to do it etc.

--- JukkaL, 18 May 2018

“X的类型”的静态等价物是Type[X]。这对None也有效:

def foo() -> Type[None]:
    pass

然而,它基本上等同于Type[True]和类似的。它消除了一种特殊情况(使用值而不是类型)和另一种特殊情况(使用从值派生的类型)。惯用的特例就是使用None


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

For a checked function, the default annotation for arguments and for the return type is Any.

这意味着该值被认为是动态类型的和静态的supports any operation。这实际上是void的相反含义。

这直接来自PEP 484 -- Type Hints文档:

When used in a type hint, the expression None is considered equivalent to type(None).

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

相关问题 更多 >