如何规避mypy中的“名称已定义错误”?

问题描述

所以我在一些代码上做类型注释。并且此代码遵循以下约定。

我有某种定义某些类的基本模块

#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 必须具有不同的语义,否则它们将是一个类。因此,无法通过快速检查从代码中判断一个类或另一个类是打算

忽略此警告后果自负。