带有Python导入的无限循环;寻找肾盂道
我的团队正在和Django一起做一个大项目。为了简单起见,下面是简单的Python来说明问题(最初的问题是模型和应用程序,而不是类(我知道两者都是类)和包(我知道两者都是包)) a、 py: b、 py: 当调用a.py时,它尝试从b包导入B1,而b包则尝试从包导入A2,然后从一开始就一直重复。Python说:带有Python导入的无限循环;寻找肾盂道,python,architecture,import,infinite-loop,Python,Architecture,Import,Infinite Loop,我的团队正在和Django一起做一个大项目。为了简单起见,下面是简单的Python来说明问题(最初的问题是模型和应用程序,而不是类(我知道两者都是类)和包(我知道两者都是包)) a、 py: b、 py: 当调用a.py时,它尝试从b包导入B1,而b包则尝试从包导入A2,然后从一开始就一直重复。Python说: [dagrevis@localhost recursion]$ python2 a.py Traceback (most recent call last): File "a.py"
[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
[dagrevis@localhost递归]$python2 a.py
回溯(最近一次呼叫最后一次):
文件“a.py”,第1行,在
从b进口B1
文件“/home/dagrevis/Python/recursion/b.py”,第1行,在
从进口A2
文件“/home/dagrevis/Python/recursion/a.py”,第1行,在
从b进口B1
ImportError:无法导入名称B1
解决方案之一是每个对象有一个文件。类似C++或java的东西。然后我想起了Guido关于Python的说法:“不要在Python中编写java(C++或javascript……)。”有更多的Python方式来处理这个问题吗?< /P>
感谢您的建议!您的用例不是“可解决的”。您可以将ImportError
转换为AttributeError
导入模块a
(和b
),而不是导入对象,但这不会改变您无法使用这些模块的事实
问题在于,您的模块a
需要在导入之前完全执行b
,但是b
要求a
在导入之前完全执行
这根本不可能解决,而且这是一个明显的症状,即需要重构:您的a
和b
模块应该是一个单独的模块(或者您可能需要进行更深入的重构)
编辑:
实际上,您可能能够解决这个问题,尽管我认为这样做很难看,在需要导入时,将导入放在文件的末尾。
但我认为这只是解决一些更大问题的一个补丁。您的示例过于简化——它没有解释为什么需要循环导入。但无论如何,这里有一种方法可以将其重构为可运行的代码: a、 py: b、 py: c、 py:
以下是一些背景信息:你的答案可能会重复,这比我的答案更清楚、更准确,我将删除我的答案。
from a import A2
class B1(object):
def __init__(self):
print "object B1"
A2()
[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
class A1(object):
def __init__(self):
print "object A1"
class A2(object):
def __init__(self):
print "object A2"
class B1(object):
def __init__(self):
print "object B1"
from a import A1, A2
from b import B1
A1()
A2()
B1()