2016-03-04 63 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