在 python 3.x 中,通常使用函数的返回类型注解,例如:
def foo() -> str:
return "bar"
“void”类型的正确注释是什么?
我正在考虑 3 个选项:
def foo() -> None:不符合逻辑 IMO,因为 None 不是类型, def foo() -> type(None):使用我知道的最佳语法来获取 NoneType,def foo():省略显式返回类型信息.
选项 2. 对我来说似乎是最合乎逻辑的,但我已经看到了 1 的一些实例。
void
的函数。任何没有显式 return
的函数(或函数中的分支)都将返回 None
。我假设 OP 明白,这个评论主要是为了未来读者的利益......
None
进行类型提示似乎不合逻辑,因为它不是一种类型,除非知道在内部 None
被解释为 type(None)
,即 NoneType
。
TLDR:void
返回类型注释的惯用等效项是 -> None
。
def foo() -> None:
...
这与没有 return
或仅包含 return
的函数的计算结果为 None
相匹配。
def void_func(): # unannotated void function
pass
print(void_func()) # None
省略返回类型 not 表示没有返回值。根据 PEP 484:
对于检查函数,参数和返回类型的默认注释是 Any。
这意味着该值被视为动态类型和静态 supports any operation。这实际上是 void
的相反含义。
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 whether to remove support,并且也将其从 484 中删除。
或者我们应该更新 PEP 484 以不建议 type(None) 作为类型有效,并且 None 是唯一正确的拼写?应该有一种——最好只有一种——明显的方法等等。——JukkaL,2018 年 5 月 18 日
不定期副业成功案例分享
NoReturn
类型的 this question 使用“......注释永远不会正常返回的函数。例如,无条件引发异常的函数......”