<p>主要原因是允许静态类型检查。默认情况下,<code>mypy</code>将忽略未注释的函数和方法</p>
<P>考虑以下定义:</P>
<pre><code>class Foo:
def __init__(self):
return 3
f = Foo()
</code></pre>
<p><code>mypy</code>是一个静态类型分析工具,默认情况下,它没有发现任何问题:</p>
<pre><code>$ mypy tmp.py
Success: no issues found in 1 source file
</code></pre>
<p>但是它会生成一个运行时<code>TypeError</code>(注意<code>python</code>这里是Python 3.8.6):</p>
<pre><code>$ python tmp.py
Traceback (most recent call last):
File "tmp.py", line 5, in <module>
f = Foo()
TypeError: __init__() should return None, not 'int'
</code></pre>
<p>如果添加注释<code>-> None</code>,则<code>mypy</code>将键入check方法并引发错误:</p>
<pre><code>$ mypy tmp.py
tmp.py:3: error: No return value expected
Found 1 error in 1 file (checked 1 source file)
</code></pre>
<p>如果您试图通过声明<code>def __init__(self) -> int:</code>来规避检查,<code>mypy</code>甚至会抱怨:</p>
<pre><code>$ 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)
</code></pre>
<p>还值得注意的是,<em>任何</em>注释都会引起<code>mypy</code>的注意;如果您至少有一个带注释的参数,则缺少返回类型与<code>-> None</code>相同:</p>
<pre><code>def __init__(self, x: int):
return x
</code></pre>
<p>将产生与显式<code>-> None</code>相同的“预期无返回值”错误。但是,显式返回类型通常比任何人工参数类型提示更容易提供,并且可以说比尝试键入<code>self</code>更清晰</p>