Python 跨模块转发引用
在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
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)