我正在使用Python 3.3.2編寫封裝文件系統的包。我的項目如下所示:Python包設計和循環導入
~/
python/
filesystem/
__init__.py
file.py
directory.py
With PYTHONPATH=~/python
。
的問題是,需要file.py
directory.py
(例如,用於File.get_directory()
)和directory.py
需要file.py
(例如,用於Directory.get_files()
),所以我具有圓形進口。
- 當我使用
file.py
import directory
,並在import file
directory.py
,它只有當我的工作目錄是filesystem
工程(即當進口本地)。 - 當我使用
file.py
import filesystem.directory
,和import filesystem.file
在directory.py
,它工作正常,但寫filesystem.file.File
的審美滋擾及filesystem.Directory.directory
全部時間。 - 奇怪的是,當我使用
import filesystem.directory as directory
或from filesystem.directory import Directory
時,我得到了循環導入錯誤'module' object has no attribute 'directory'
。我的猜測是,雖然import ...
是懶惰的,但import ... as
和from ... import
試圖評估模塊並立即注意到圓度。 - 解決此問題的一種方法是使用它的函數內部的
import filesystem.directory
。不幸的是,我的許多方法都使用它,並且在類中導入它似乎不起作用。
這當然是可以解決的:吸起來寫filesystem.directory.Directory
;將__import__
分配給__init__
方法中的全局變量以供所有其他方法使用;在同一文件中定義File
和Directory
;等等。但這些都比解決方案更妥協,所以我的問題仍然存在:所以我的問題仍然存在:
- 如何設計文件系統,其中文件類使用目錄類,反之亦然?
- 更一般地說,你將如何處理(或避免)循環進口?
謝謝。
UPDATE [2013年3月7日](大多爲討論的緣故)
另一種解決方案我來到是某種前向聲明的,與空file
和directory
類在一個共同的報頭,接着分開實現(更像屬性添加)。雖然最終的設計非常整潔,但這個想法更多的是C++ - 而不是Pythonic。
處理循環進口花了我一段時間。我真的必須將我的模塊(手動)繪製成樹形結構,確保我只向一個方向運送我的依賴關係。一旦我在做出更大的項目決策之前開始這樣做,它確實減少了我稍後必須做的重構。 – BlackVegetable
@BlackVegetable - 你將如何設計沒有循環導入的描述文件系統?它看起來固有地是循環的,所以我很樂意聽到一些外部的替代設計。 –