我的团队正在使用 Django 开展大型项目。为了简单起见,这里使用简单的 Python 来说明问题(原始问题有模型和应用程序而不是类(我知道它们都是类)和包(我知道它们也是包))。
a.py:
from b import B1
class A1(object):
def __init__(self):
print "object A1"
class A2(object):
def __init__(self):
print "object A2"
A1()
B1()
b.py:
from a import A2
class B1(object):
def __init__(self):
print "object B1"
A2()
当 a.py 被调用时,它会尝试从 b 包中导入 B1,而另一方面,它会尝试导入 < em>A2 来自 a 包,然后从头开始,永远重复。 Python 说:
[dagrevis@localhost recursion]$ python2 a.py
Traceback (most recent call last):
File "a.py", line 1, in <module>
from b import B1
File "/home/dagrevis/Python/recursion/b.py", line 1, in <module>
from a import A2
File "/home/dagrevis/Python/recursion/a.py", line 1, in <module>
from b import B1
ImportError: cannot import name B1
解决方案之一是每个对象一个文件。像 C++ 或 Java 这样的东西。然后我想起了 Guido 对 Python 的评价:“不要用 Python 编写 Java(或 C++,或 Javascript,...)。”。有没有更多 Pythonic 的方法来处理这个问题?
感谢任何建议!
最佳答案
您的用例不是“可解决的”。您可以将 ImportError
转换为 AttributeError
导入模块 a
(和 b
)而不是导入对象,但这不会改变您将无法使用这些模块的事实。
问题是你的模块 a
需要在导入前完全执行 b
,而且 b
还需要 a
在被导入之前完全执行。
这根本不可能解决,这是一个明显的症状,需要重构:你的 a
和 b
模块应该是一个单一的模块(或者你可能想要做一些更深层次的重构)。
编辑: 实际上你可以解决这个问题,即使我认为这样做很丑陋,在需要时将导入放在文件末尾。 但我认为这只是一些更大问题的补丁。
关于python - 使用 Python 导入的无限循环;寻找 Pythonic 方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12474374/