mypy 是否需要__init__具有 -> 无注释



看到矛盾的结果:

class A:
def __init__(self, a: int):
pass

上面的代码片段通过了mypy测试,但是下面的代码片段没有通过。

class A:
def __init__(self):
pass

知道为什么吗?

在这里记录。

当一个函数至少有一个(带注释的)参数时,它被认为是(至少部分地)类型化的。当参数和返回值都没有注释时,函数被认为是未类型化的.

这个区别很重要,因为默认情况下,mypy根本不检查无类型函数的体。此行为可通过check_untyped_defs配置。

注意,只有在设置disallow_untyped_defs(或strict)时,才会出现关于缺少返回类型的抱怨。否则,两个示例都不会触发错误。

__init__方法得到了特殊的处理,因为人们抱怨总是返回None,而他们不想相应地显式地写出返回类型。这就是为什么这种行为如此不一致。

class A:
def __init__(self, x: int):  # this is fine with `mypy`
pass
def foo(self, x: int):
print("hi")

class B:
def __init__(self):
pass
def foo(self):
print("hi")

在所有这些方法中,只有A.__init__被认为是完全类型的(因为__init__隐式返回None)。当disallow_untyped_defs设置为

时,所有其他方法都会触发错误。
error: Function is missing a return type annotation [no-untyped-def]

我不是特别喜欢这种方法,但这就是他们决定处理它的方式。

相关内容

  • 没有找到相关文章

最新更新