看到矛盾的结果:
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]
我不是特别喜欢这种方法,但这就是他们决定处理它的方式。