mypy:如何忽略Mixins中的“缺少属性”错误

时间:2018-11-02 14:16:54

标签: mypy

我无法让mypy与mixins一起正常工作:它一直抱怨我的mixins引用缺少的属性。考虑以下示例:

Future

如果我在此文件上运行mypy,则会收到错误消息:

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()

当然,它没有属性“值”。它是一个mixin,不应具有自己的属性!

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

1 个答案:

答案 0 :(得分:0)

我认为这是类层次结构设计不完善的标志。 Mixins不应依赖继承它们的类中的东西。我知道这是反对鸭子打字的,但是我们处于“静态”打字领域,规则在这里更加严格。

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

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

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

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