在包中循环导入的正确方法(对于pep-0484)

时间:2015-12-14 23:49:06

标签: python python-3.x

我正在尝试找出一种(和 )方法来正确使用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文件导入两个模块,甚至一起删除该文件,我似乎无法进行此操作。

0 个答案:

没有答案