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

问题描述 投票:0回答:3

所以我正在对一些代码进行类型注释。这段代码遵循以下约定。

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

#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 中?我找不到这里

python python-typing mypy
3个回答
3
投票

尝试为基类定义别名:

from module1 import A as ABase

class A(ABase):
    ...

但是如果可以的话,您可能应该更改类的名称。


2
投票

@YevhenKuzmovych 的解决方案是最快的;另一种选择是重命名父类或子类。在同一上下文中拥有两个同名的不同类并不好,并且可能会导致难以调试的问题:

  • 当您单独看到一个
    A
    时,您不知道它是哪个
    A
  • 两个
    A
    必须具有不同的语义,否则它们将是一个类。因此,无法通过快速检查从代码中判断一个类或另一个类是否是预期的

忽略此警告,后果自负。


1
投票

在我的例子中,错误是由 Pydantic 类引起的,其中两个字段具有相同的别名。

© www.soinside.com 2019 - 2024. All rights reserved.