mypy class 类型别名中的前向引用在其他模块中时出错

mypy class forward references in type alias gives error when in other module

我想将我的类型别名保留在一个模块中,比如 my_types,以便能够 在我的应用程序中的任何地方使用它们(类似于标准 typing 模块)。 但是 mypy 抱怨未定义对 class X 的前向引用。 如果我稍后在同一个模块中定义 class X 没关系,但是如果它定义了 在另一个中,mypy 变得不高兴。

所以我的问题是,如何将所有类型别名保存在一个模块中 没有 mypy 产生关于未定义的前向引用的错误 同一个模块?或者这是一种错误的方法?

这是我的示例代码:

from my_types import SomeXs

class X:
    pass

类型别名定义如下:

# my_types.py
from typing import List

SomeXs = List['X']

当我 运行 mypy 时,我得到一个错误 X 未定义:

$ mypy module.py
my_types.py:4: error: Name 'X' is not defined
Found 1 error in 1 file (checked 1 source file)

Mypy 需要在范围内有引用类型:

$ cat my_types.py 
from typing import List

from main import X

SomeXs = List[X]

并且包含 X 的代码未引用 SomeXs,因此不应将其导入那里:

$ cat main.py 
class X:
    pass

结果:

$ mypy .
Success: no issues found in 2 source files

我将在这里分享我在 mypy 文档 common issues section 中找到的解决方案:mypy 必须能够访问 X 的定义。为了避免导入循环,mypy 文档推荐了一个技巧——只导入定义 类型检查时会创建循环导入。它是这样的:

from typing import List, TYPE_CHECKING

if TYPE_CHECKING:
    from main import X

SomeXs = List['X']

这使得 Python 解释器在执行时忽略导入 这段代码,但 mypy 仍然使用 main.

X 的定义

瞧瞧:

$ mypy *.py
Success: no issues found in 2 source files