python 我是否要求__init__具有->None注解

0yg35tkg  于 2022-12-17  发布在  Python
关注(0)|答案(1)|浏览(251)

看到了矛盾的结果:

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

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

class A:
    def __init__(self):
        pass

知道为什么吗?

z9ju0rcb

z9ju0rcb1#

此处记录了这一点。
如果函数至少有一个(带注解的)参数,则认为该参数(至少部分)是类型化的。如果参数和返回值都没有注解,则认为该函数是非类型化的
这个区别很重要,因为默认情况下,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]

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

相关问题