Python 跨模块转发引用

Python 跨模块转发引用,python,mypy,python-typing,Python,Mypy,Python Typing,在Python类型中,循环依赖关系可以通过正向引用来解决: class A: b: "B" def __init__(self, b: "B"): self.b = b class B: a: A def __init__(self): self.a = A(self) mypy将成功进行类型检查 但是,如果我将A和B拆分到单独的文件/模块中: a.py: b.py: 并使用mypy

在Python类型中,循环依赖关系可以通过正向引用来解决:

class A:
    b: "B"

    def __init__(self, b: "B"):
        self.b = b


class B:
    a: A

    def __init__(self):
        self.a = A(self)
mypy将成功进行类型检查

但是,如果我将
A
B
拆分到单独的文件/模块中:

a.py:

b.py:

并使用mypy检查模块或软件包,失败:

$ mypy -p tt
tt/a.py:2: error: Name 'B' is not defined
tt/a.py:4: error: Name 'B' is not defined
除了将两者放在同一个文件中,还有其他解决方法吗

(使用Python 3.8.4进行测试)

编辑:

为了讨论循环导入,我添加了一个简单的
\uuuu main\uuuuu.py

from .b import B

B()
并使用
python-mt

进行测试,正如我最近介绍的,您可以使用
类型检查
变量:

# a.py
from typing import TYPE_CHECKING
if TYPE_CHECKING:
    from .b import B


class A:
    b: "B"

    def __init__(self, b: "B"):
        self.b = b

你必须进口it@juanpa.arrivillaga这将导致导入错误:无法从部分初始化的模块“tt.B”导入名称“B”(很可能是由于循环导入)不要使用模块导入名称中的
使用
导入模块
然后使用
模块。名称
对不起,我仍然收到循环导入错误消息。如果你确信这会起作用,你能提供一个最小的例子吗?谢谢你标记了标准副本。奇怪的是,我把注意力都集中在前向引用上了,我没有想到要搜索循环导入。
from .b import B

B()
# a.py
from typing import TYPE_CHECKING
if TYPE_CHECKING:
    from .b import B


class A:
    b: "B"

    def __init__(self, b: "B"):
        self.b = b
# b.py
from .a import A


class B:
    a: A

    def __init__(self):
        self.a = A(self)