我正在尝试找出一种(和 )方法来正确使用python(3.4)包中的循环导入。我完全理解循环导入通常表示代码不清晰地分离为模块,但是使用PEP-0484进行注释/类型提示将导致(我认为)完全合理的代码中的大量循环导入。在这种情况下,通常建议的将导入放入函数或模块底部的解决方案也不起作用。
简单案例(没有包,没有循环导入):
[a.py]
import b
class A:
def __init__(self):
self.b = b.B(self)
def get_b():
return self.b
[b.py]
class B:
def __init__(self, parent):
self.parent = parent
[main.py]
import a
print(a.A())
添加PEP-0484(无包装,循环导入,需要forward reference):
[a.py]
import b
class A:
def __init__(self):
self.b = b.B(self)
def get_b() -> b.B:
return self.b
[b.py]
import a
class B:
def __init__(self, parent: "a.A"):
self.parent = parent
[main.py]
import a
print(a.A())
到目前为止,这么好。但是现在我想把它作为一个包,我不能让它工作。
[pack/__init__.py] (empty)
[pack/a.py]
from . import b
class A:
def __init__(self):
self.b = b.B(self)
def get_b() -> b.B:
return self.b
[pack/b.py]
from . import a
class B:
def __init__(self, parent: "a.A"):
self.parent = parent
[main.py]
from model import a
print(a.A())
运行python main.py
的结果是
Traceback (most recent call last):
File "main.py", line 1, in <module>
from model import a
File "/private/tmp/circ/model/a.py", line 1, in <module>
from . import b
File "/private/tmp/circ/model/b.py", line 1, in <module>
from . import a
ImportError: cannot import name 'a'
我的问题:
from . import a
中的b.py
行应该导致导入一个空模块,只有在模块b
完全导入后才能填充该模块很好。a
的模块范围内引用b
,反之亦然。无论我尝试使用相对路径和绝对路径的哪种组合,从__init__.py
文件导入两个模块,甚至一起删除该文件,我似乎无法进行此操作。