2016-10-14 205 views
0

我們選擇python作爲新項目,因爲我們想使用一種語言,我們可以用非冗長的方式編寫漂亮的代碼。Python循環依賴關係

我們,我們以前寫的代碼顧問帶來了一個很大的工作方案。但是當我們看代碼時,它充斥着本地功能from X import Y。我們迅速將導入移動到文件的頂部,但現在受到循環依賴關係的影響。我們絕對不希望解決循環依賴問題,我們不希望將導入移回到非常冗長的函數中。

問題1:我們如何解決這個問題?

問題2:這是什麼循環依賴無感?當其他語言似乎解決了這個問題時,Python社區如何接受這個問題? (我希望它不被認爲是某種功能)

+0

另外相關:[?如何避免在Python圓形進口(http://stackoverflow.com/questions/7336802/how-to-avoid-circular-imports-in-python),[圓形(或環)導入Python](http://stackoverflow.com/questions/744373/circular-or-cyclic-imports-in-python) – poke

+0

工作代碼不一定是精心設計的代碼。您的顧問使用本地進口,因爲他們有循環依賴關係。但循環依賴通常是代碼異味的標誌。 – poke

+0

@poke「循環依賴通常是代碼異味的標誌」這肯定是Pyhton的具體觀點。從來沒有在Java/C#/ Swift中出現任何這樣的問題 –

回答

3

循環依賴性是由A導入B和B導入A導致的。通常的解決方案是生成一個C,它導入B和A以便A和B不必相互導入。如果兩個文件耦合得太緊,也可以連接這兩個文件。

這是幾乎所有語言的問題;用循環依賴關係來解析代碼很困難,所以大多數語言都將它限制爲一個有向無環圖。

通過導入內部功能模塊,您避免循環依賴。有些。首先A導入B,然後,當函數被調用時,B可以導入A.因爲你必須調用B的函數來導入A,所以你不會得到相同的A導入B導入A導入B ...循環。

2

我們處理循環依賴,因爲我們通常不創建它們。當兩個模塊需要彼此時並不常見。

如果你不能重構你的A和B模塊插入,無論進口,你應該只使用本地進口的模塊之一,只有在需要它的功能的通用模塊C。

但是,真的,你會更好地修改你的模塊。