1

结构如下:一个模块test包含两个子模块test.footest.bar.

test.foo有一个基于python文档inc()使用so的函数是包含它的正确方法,并且可以按预期工作。test.bar.bar()from . import bar

test.bar但是,也有一个使用 的功能inc2test.foo.foo但是当from . import foo使用时,这两个模块都会中断。

实现这一目标的正确方法是什么?我在 python 文档或搜索中几乎找不到。

代码

测试/_初始化_.py

#empty

测试/foo.py

from . import bar

def foo():
    print("I do foo")

def inc():
    print(bar.bar())

测试/bar.py

from . import foo

def bar():
    print("I do bar")

def inc2():
    print(foo.foo())

错误 1

>>> import test.foo
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "test/foo.py", line 1, in <module>
    from . import bar
  File "test/bar.py", line 1, in <module>
    from . import foo
ImportError: cannot import name foo

错误 2

>>> import test.bar
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "test/bar.py", line 1, in <module>
    from . import foo
  File "test/foo.py", line 1, in <module>
    from . import bar
ImportError: cannot import name bar
4

1 回答 1

4

解决方案是将两个模块所需的代码分解到两个模块都导入的第三个模块中。例如,将foo函数放入第三个模块。

以前有很多关于此的 StackOverflow 问题,例如Python 中的循环导入依赖项。另见http://effbot.org/zone/import-confusion.htm#circular-imports

于 2012-07-22T07:32:55.673 回答