所以我正在对一些代码进行类型注释。这段代码遵循以下约定。
我有某种定义某些类的基本模块
#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 中?我找不到这里。
尝试为基类定义别名:
from module1 import A as ABase
class A(ABase):
...
但是如果可以的话,您可能应该更改类的名称。
@YevhenKuzmovych 的解决方案是最快的;另一种选择是重命名父类或子类。在同一上下文中拥有两个同名的不同类并不好,并且可能会导致难以调试的问题:
A
时,您不知道它是哪个 A
。A
必须具有不同的语义,否则它们将是一个类。因此,无法通过快速检查从代码中判断一个类或另一个类是否是预期的。忽略此警告,后果自负。
在我的例子中,错误是由 Pydantic 类引起的,其中两个字段具有相同的别名。