2016-03-04 114 views
1

我正在将一系列python文件导入到自己的模块中。因此,我把它们放在一个目录中,并添加了一个init文件。组织__init__.py文件时出现循环导入错误

为了让我成为访问它们如下

from module import subclass 

而不是

from module.submodule import subclass 

我试图导入所有我想在暴露给初始化文件中的类。然而,由于许多子模块彼此相互引用(它是一个Django项目,所以所有的类都是外键的),当我运行代码时,我很快就会运行到循环导入。

有没有正确的方法来组织初始 .py文件,这样可以避免?

例如:

File "/Users/.../models/__init__.py", line 4, in <module> 
from Guests import Guest 
    File "/Users/.../models/Guests.py", line 5, in <module> 
from Logs import LogEntry 
    File "/Users/..../models/Logs.py", line 6, in <module> 
from Staff import Staff 
    File "/Users/.../Staff.py", line 5, in <module> 
from Properties... import Site 
    File "/Users/./Properties.py", line 7, in <module> 
from Guests import Guest 
ImportError: cannot import name Guest 

回答

1

如果A依赖于X和X依赖于A可能是他们想以同一单元内居住,这是更好地检查和分割你的循环依赖关系到同一个模块,然后寻找解决方法。

不推荐:但是,如果你不能调整你的包的结构,你可以将循环导入移动到函数定义或遵循该原则(我不知道你的代码...)。

如果类A.py取决于B.py和B.py取决于A.py:

# B.py 
class B: 

    def __init__(self): 
     import A 
     A.some_method() 

更新:正如在评论中指出这是Django的外键变量事业圆形的进口,以避免问题删除类的导入,并使用模型名称作为字符串。

item = models.ForeignKey('class_file.Item') 
+0

的问题是,有作用在所有其他的Django模型的记录更改,以便将绑在一起的一切,但随后的代码为O测井模型(3K),线长,这是有点失控。它没有太多,他们直接相互依赖 - A呼叫B,但B是外键A。 – JMzance

+0

@JMzance我已经用解决方法更新了答案。 –

+1

由于Django外键是类变量,我也不能'隐藏'函数定义中的导入。 – JMzance

相关问题