考虑以下示例。这个例子是人为的,但通过可运行的示例说明了要点:
class MultiplicatorMixin:
def multiply(self, m: int) -> int:
return self.value * m
class AdditionMixin:
def add(self, b: int) -> int:
return self.value + b
class MyClass(MultiplicatorMixin, AdditionMixin):
def __init__(self, value: int) -> None:
self.value = value
instance = MyClass(10)
print(instance.add(2))
print(instance.multiply(2))
当执行此命令时,将会产生以下输出:12
20
代码可以正常运行。
但在运行mypy
时,会产生以下错误:
example.py:4: error: "MultiplicatorMixin" has no attribute "value"
example.py:10: error: "AdditionMixin" has no attribute "value"
我了解为什么mypy会给出这个结果,但Mixin类从来没有单独使用,它们总是作为附加的超类使用。
在上下文中,这是一个已经存在的应用程序中使用的模式,我正在添加类型提示。在这种情况下,这些错误是误报的。我正在考虑重写使用Mixins的部分,因为我不是特别喜欢它,而且可能可以通过重新组织类层次结构来达到相同的效果。
但我仍然想知道如何正确地进行提示。
mypy
错误的原因吗?还是即使没有类型提示,您仍然会遇到这些错误?如果是这种情况,那么类型提示与问题无关,我认为您的问题应该是“如何处理mypy中缺少属性错误?” - Jonathon Reinhartmypy
将不再起作用(假设一切都是Any
类型)。所以我不明白这样做的意义。顺便说一下,我删除了类型提示并再次运行它,正如预期的那样,错误已经消失了(因为一切都是Any
)。 - exhuma# type: ignore
注释,但在完全禁用类型检查之前,我想看看是否有其他选择。 - exhuma