Python void返回类型注释

时间:2016-04-22 15:02:46

标签: python annotations void type-hinting

在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():
    • 省略显式返回类型信息。
  4. 选项2.对我来说似乎最合乎逻辑,但我已经看到了一些1的实例。

2 个答案:

答案 0 :(得分:53)

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

  

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

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

答案 1 :(得分:0)

TLDR:void返回类型注释的惯用等效项是-> 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

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


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

  

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

     

--- considering to remove support

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

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

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


省略返回类型并不会表示没有返回值。根据{{​​3}}:

  

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

这意味着该值被认为是动态类型且静态为JukkaL, 18 May 2018。这实际上是void的相反含义。