在python 3.x中,通常使用函数的返回类型注释,例如:
def foo() -> str:
return "bar"
“void”类型的正确注释是什么?
我正在考虑3种选择:
def foo() -> None:
None
不是类型,def foo() -> type(None):
NoneType
,def foo():
选项2.对我来说似乎最合乎逻辑,但我已经看到了一些1的实例。
答案 0 :(得分:53)
答案 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
是唯一正确的拼写?应该有一种-最好只有一种-明显的方式来做到这一点,等等。
“ X的类型”的静态等效项为Type[X]
。这对None
也有效:
def foo() -> Type[None]:
pass
但是,它基本上等效于Type[True]
及其类似物。它消除了一种特殊情况(使用值代替类型)和另一种特殊情况(使用从值派生的类型)。惯用的特殊情况是只使用None
。
省略返回类型并不会表示没有返回值。根据{{3}}:
对于选中的函数,参数和返回类型的默认注释为
Any
。
这意味着该值被认为是动态类型且静态为JukkaL, 18 May 2018。这实际上是void
的相反含义。