为什么我们应该在 ->
def __init__(self, n) -> None:
?我阅读了 PEP 484 中的以下摘录,但我无法理解其含义。
(注意
__init__
的返回类型应该用-> None
-> None
。原因很微妙。如果__init__
假设返回注释---
,这是否意味着一个无参数、未注释的__init__
方法仍应进行类型检查?与其让这个模棱两可或引入异常,我们只是说__init__
应该有一个返回注释;因此默认行为与其他方法相同。)
使用 def __init__(self, n) -> None:
和 def __init__(self, n):
之间的细微差别是什么?有人可以用简单的话解释引用的摘录吗?
原文由 user14612542 发布,翻译遵循 CC BY-SA 4.0 许可协议
主要原因是允许静态类型检查。默认情况下,
mypy
将忽略未注释的函数和方法。考虑以下定义:
mypy
静态类型分析工具,默认看不出有什么问题:但它会产生一个运行时
TypeError
(注意python
这里是Python 3.8.6):如果添加注释
-> None
,那么mypy
将对该方法进行类型检查并引发错误:mypy
如果你试图通过声明def __init__(self) -> int:
来规避检查,甚至会抱怨:还值得注意的是, 任何 注释都会使
mypy
注意;缺少返回类型与-> None
相同,如果您至少有一个带注释的参数:将产生与显式
-> None
相同的“No return value expected”错误。但是,显式返回类型通常比任何人工参数类型提示更容易提供,并且可以说比尝试键入self
更清晰。