2017-01-23 79 views
1

我正在清理一些我繼承的Python(2.7)代碼,並且遇到了我想擺脫的循環導入場景。代碼當前正在運行(通過濫用導入功能),但是當其他代碼無法以特定方式訪問代碼時,會造成問題。避免包裝中的循環依賴關係

文件結構基本上是這樣的:

/deep/nested/path/__init__.py 
/deep/nested/path/objects.py 
/deep/nested/path/api.py 

objects是數據模型的集合

api暴露開發接口函數來獲取/創建objects實例。

發生循環導入是因爲某些objects需要調用api函數來創建子對象。

這段代碼處理分析並執行很多(很多對象,深遞歸)。包命名空間也相當嵌套 - 所以使用包路徑對性能有明顯影響。

我很想嘗試將objects所需的工廠功能移動到該文件中,然後將它們重新導入api以供一般使用。這將解決我的問題(並消除點),但失去了一些代碼組織(這實際上很體面)。我希望另一雙眼睛能夠提供一些意見。

雖然在這裏已經有幾個關於循環導入的問題,但我並不關心如何讓它工作(它的確如此)。我很關心最小化點表示法。 api.factoryobjects.foo工作,但package.api.factory不會。

回答

0

也許最好將這些工廠功能移到第三個 模塊中。然後objects可以導入它來創建它的對象; api可以 如果需要,可以導入它;其他模塊可以將其導入,如果他們需要它包含的內容 。