【发布时间】:2020-11-19 22:33:31
【问题描述】:
在 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:
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)
并使用 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 测试)
编辑:
关于循环导入的讨论,我添加了一个琐碎的__main__.py:
from .b import B
B()
并使用python -m tt进行测试
【问题讨论】:
-
你必须导入它
-
@juanpa.arrivillaga 这将导致
ImportError: cannot import name 'B' from partially initialized module 'tt.b' (most likely due to a circular import) -
不要使用
from module import name使用import module然后使用module.name -
抱歉,我仍然收到循环导入错误消息。如果你确定这会奏效,你能提供一个最小的例子吗?
-
感谢您标记规范副本。奇怪的是,我如此专注于前向引用作为问题,我没想到要搜索循环导入。
标签: python mypy python-typing