gpt4 book ai didi

python - 为什么要使用 -> in def __init__(self, n) -> None :?

转载 作者:行者123 更新时间:2023-12-04 02:29:50 31 4
gpt4 key购买 nike

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

(Note that the return type of __init__ ought to be annotated with-> None. The reason for this is subtle. If __init__ assumed areturn annotation of -> None, would that mean that an argument-less,un-annotated __init__ method should still be type-checked? Ratherthan leaving this ambiguous or introducing an exception to theexception, we simply say that __init__ ought to have a returnannotation; the default behavior is thus the same as for othermethods.)


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

最佳答案

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

class Foo:
def __init__(self):
return 3

f = Foo()
mypy 是一个静态类型分析工具,默认情况下没有发现任何问题:
$ mypy tmp.py
Success: no issues found in 1 source file
但它会生成一个运行时 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'
如果添加注释 -> None ,则 mypy 将对该方法进行类型检查并引发错误:
$ mypy tmp.py
tmp.py:3: error: No return value expected
Found 1 error in 1 file (checked 1 source file)
如果您尝试通过声明 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)
同样值得注意的是,任何注解都会让 mypy 引起注意;如果您至少有一个带注释的参数,则缺少返回类型与 -> None 相同:
def __init__(self, x: int):
return x
将产生与显式 -> None 相同的“无预期返回值”错误。然而,显式返回类型通常比任何人工参数类型提示更容易提供,并且可以说比尝试输入 self 更清晰。

关于python - 为什么要使用 -> in def __init__(self, n) -> None :?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64933298/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com