Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有Python导入的无限循环;寻找肾盂道_Python_Architecture_Import_Infinite Loop - Fatal编程技术网

带有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"

我的团队正在和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", 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()