问题描述
我有某种定义某些类的基本模块
#module1.py
class A():
attr1 = 'hello'
attr2 = 'world'
class B():
attr3 = 'hi'
attr4 = 'earth'
然后在其他一些模块中,我导入并继承它们并覆盖一些属性。
#module2.py
from module1 import *
class A(A):
attr1 = 'bye'
class B(B):
attr3 = 'goodbye'
当我对此运行 mypy 时,它会出现以下错误:Name 'A' already defined (possibly by an import)
有没有什么办法可以解决这个问题,而无需向 mypy 中出现的每个错误实例添加 # type: ignore
?我能想到的唯一其他解决方案是重命名基类,例如class ABase():
,但这是不可能的。因为在某些模块中,A 不会被覆盖,但我仍然需要从该模块访问 A。例如。 module3 可能是
from module1 import *
class B(B):
attr3 = 'something'
所以在这里,我没有覆盖 A,但我仍然需要能够访问 module3.A.attr1
,如果我重命名基类,这是不可能的。这是可能的,还是我应该忽略所有错误。如果是这样,是否可以将单个配置设置添加到 mypy.ini 中?我找不到任何here。
解决方法
尝试为基类定义别名:
from module1 import A as ABase
class A(ABase):
...
但是如果可以的话,您可能应该只更改类的名称。
,@YevhenKuzmovych's solution 是最快的;另一种选择是重命名父类或子类。在同一个上下文中拥有两个同名的不同类不太好,并且可能会导致难以调试的问题:
- 当您单独看到
A
时,您不知道它是哪个A
。 - 两个
A
必须具有不同的语义,否则它们将是一个类。因此,无法通过快速检查从代码中判断一个类或另一个类是打算。
忽略此警告后果自负。