为什么要使用->
in def __init__(self, n) -> None:
?我阅读了PEP 484的以下摘录,但我无法理解它的含义。
(请注意, 的返回类型
__init__
应该用 注释-> None
。这样做的原因很微妙。如果__init__
假设返回注释是-> None
,这是否意味着无参数、未注释的__init__
方法仍应进行类型检查?而不是离开这种模棱两可的或引入异常的异常,我们只是说__init__
应该有一个返回注释;因此默认行为与其他方法相同。)
usingdef __init__(self, n) -> None:
和之间的细微区别是def __init__(self, n):
什么?有人可以用简单的话解释引用的摘录吗?
主要原因是允许静态类型检查。默认情况下,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 -> None
,mypy
则会对该方法进行类型检查并引发错误:
$ 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
。
归档时间: |
|
查看次数: |
6188 次 |
最近记录: |