看到了矛盾的结果:
class A: def __init__(self, a: int): pass
上面的代码片段通过了mypy测试,但下面的代码片段没有。
mypy
class A: def __init__(self): pass
知道为什么吗?
z9ju0rcb1#
此处记录了这一点。如果函数至少有一个(带注解的)参数,则认为该参数(至少部分)是类型化的。如果参数和返回值都没有注解,则认为该函数是非类型化的。这个区别很重要,因为默认情况下,mypy根本不检查无类型函数的函数体,这个行为可以通过check_untyped_defs配置。注意,只有在设置disallow_untyped_defs(或strict)时才会出现缺少返回类型的问题,否则两个示例都不会触发错误。__init__方法受到了特殊对待,因为人们抱怨总是返回None,而他们不想相应地显式写出返回类型,这就是为什么该行为如此不一致。
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设置时触发错误:
A.__init__
error: Function is missing a return type annotation [no-untyped-def]
我不是特别喜欢这种方法,但这就是他们决定处理它的方式。
1条答案
按热度按时间z9ju0rcb1#
此处记录了这一点。
如果函数至少有一个(带注解的)参数,则认为该参数(至少部分)是类型化的。如果参数和返回值都没有注解,则认为该函数是非类型化的。
这个区别很重要,因为默认情况下,
mypy
根本不检查无类型函数的函数体,这个行为可以通过check_untyped_defs
配置。注意,只有在设置
disallow_untyped_defs
(或strict
)时才会出现缺少返回类型的问题,否则两个示例都不会触发错误。__init__
方法受到了特殊对待,因为人们抱怨总是返回None
,而他们不想相应地显式写出返回类型,这就是为什么该行为如此不一致。在所有这些方法中,只有
A.__init__
被认为是完全类型化的(因为__init__
隐式返回None
)。所有其他方法都将在disallow_untyped_defs
设置时触发错误:我不是特别喜欢这种方法,但这就是他们决定处理它的方式。