为什么我们应该在 def __init__(self, n) -> None: 中使用 ->

5 python class init

为什么要使用->in def __init__(self, n) -> None:?我阅读了PEP 484的以下摘录,但我无法理解它的含义。

(请注意, 的返回类型__init__应该用 注释 -> None。这样做的原因很微妙。如果__init__假设返回注释是-> None,这是否意味着无参数、未注释的__init__方法仍应进行类型检查?而不是离开这种模棱两可的或引入异常的异常,我们只是说__init__应该有一个返回注释;因此默认行为与其他方法相同。)

usingdef __init__(self, n) -> None:和之间的细微区别是def __init__(self, n):什么?有人可以用简单的话解释引用的摘录吗?

che*_*ner 5

主要原因是允许静态类型检查。默认情况下,mypy将忽略未注释的函数和方法。

考虑以下定义:

class Foo:
    def __init__(self):
        return 3

f = Foo()
Run Code Online (Sandbox Code Playgroud)

mypy,一个静态类型分析工具,默认情况下没有发现任何问题:

$ mypy tmp.py
Success: no issues found in 1 source file
Run Code Online (Sandbox Code Playgroud)

但它会生成一个运行时TypeError(请注意,python这里是 Python 3.8.6):

$ python tmp.py
Traceback (most recent call last):
  File "tmp.py", line 5, in <module>
    f = Foo()
TypeError: __init__() should return None, not 'int'
Run Code Online (Sandbox Code Playgroud)

如果添加 annotation -> Nonemypy则会对该方法进行类型检查并引发错误:

$ mypy tmp.py
tmp.py:3: error: No return value expected
Found 1 error in 1 file (checked 1 source file)
Run Code Online (Sandbox Code Playgroud)

mypy如果您试图通过声明来规避检查,甚至会抱怨def __init__(self) -> int:

$ mypy tmp.py
tmp.py:2: error: The return type of "__init__" must be None
Found 1 error in 1 file (checked 1 source file)
Run Code Online (Sandbox Code Playgroud)

还值得注意的是,任何注释都会mypy引起注意;缺少返回类型与-> None您至少有一个带注释的参数相同:

def __init__(self, x: int):
     return x
Run Code Online (Sandbox Code Playgroud)

将产生与显式-> None. 然而,显式返回类型通常比任何人工参数类型提示更容易提供,并且可以说比尝试输入更清晰self