mypy:如何忽略 mixins 中的 "missing attribute" 错误

mypy: how to ignore "missing attribute" errors in mixins

我无法让 mypy 与 mixins 一起正常工作:它一直抱怨我的 mixins 引用了缺失的属性。考虑这个例子:

class PrintValueMixin:
    """A mixin that displays values"""

    def print_value(self) -> None:
        print(self.value)


class Obj(PrintValueMixin):
    """An object that stores values. It needs a mixin to display its values"""

    def __init__(self, value):
        self.value = value


instance = Obj(1)
instance.print_value()

如果我在这个文件上 运行 mypy,我得到一个错误:

error: "PrintValueMixin" has no attribute "value"

当然没有属性"value"。是mixin,不应该有自己的属性!

那么如何让 mypy 理解这一点?

我认为这是 class 层次结构设计不完善的标志。 Mixins 不应该依赖于 classes 继承它们的东西。我知道这不利于鸭子打字,但我们处于 "static" 打字领域,这里的规则更加严格。

如果您想在不重构代码的情况下解决问题,您可以执行以下操作:

class PrintValueMixin:
    """A mixin that displays values"""
    value: int   # or whatever type it has

    def print_value(self) -> None:
        print(self.value)                                

现在,错误消失了。这是因为 mypy 将 value 视为 class 属性。注意它是未初始化的——value 没有任何对象绑定到它。因此,这在运行时没有实际影响,您不会错误地使用它。