Python void返回类型注释

Tre*_*reg 65 python annotations void type-hinting

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

def foo() -> str:
    return "bar"
Run Code Online (Sandbox Code Playgroud)

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

我正在考虑3种选择:

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

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

AKS*_*AKS 79

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

在类型提示中使用时,表达式None被认为是等效的type(None).

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

  • 澄清一下,选择上面的选项1. (7认同)
  • @asmaier根据[这个问题](/sf/ask/2699910111/)引用[PEP 484 - 类型提示](https:// www .python.org/dev/peps/pep-0484 /)`NoReturn`类型用于"...注释永远不会正常返回的函数.例如,一个无条件地引发异常的函数......" (6认同)
  • 那么NoReturn类型https://www.python.org/dev/peps/pep-0484/#the-noreturn-type? (3认同)

Mis*_*agi 11

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

def foo() -> None:
    pass
Run Code Online (Sandbox Code Playgroud)

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

类似地,类型注释None被认为 “ is of NoneType”。这不仅可以用于返回类型,尽管您会经常在以下位置看到它:

bar : None

def foo(baz: None) -> None:
    return None
Run Code Online (Sandbox Code Playgroud)

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


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

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

--- JukkaL,2018年5月18日

“ X的类型”的静态等效项是Type[X]。这也适用于None

def foo() -> Type[None]:
    pass
Run Code Online (Sandbox Code Playgroud)

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


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

对于选中的函数,参数和返回类型的默认注释为Any

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