[英]Python Package Design And Circular Imports
我正在使用Python 3.3.2編寫一個封裝文件系統的包。 我的項目看起來像這樣:
~/
python/
filesystem/
__init__.py
file.py
directory.py
使用PYTHONPATH=~/python
。
問題是, file.py
需要directory.py
(例如,對於File.get_directory()
),而directory.py
需要file.py
(例如,對於Directory.get_files()
),所以我有一個循環導入。
file.py
使用import directory
,並在directory.py
import file
時,它只在我的工作目錄是filesystem
(即導入是本地的)時才有效。 file.py
使用import filesystem.directory
,並在directory.py
import filesystem.file
時,它工作正常,除了編寫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
; 為__init__
方法中的全局變量賦予__import__
以供所有其他方法使用; 在同一文件中定義File
和Directory
; 等等。 但這些比解決方案更妥協,所以我的問題仍然存在:
謝謝。
更新[03.07.2013] (主要是為了討論的緣故)
我遇到的另一個解決方案是某種前向聲明,在公共頭中有空file
和directory
類,后面是單獨的實現(更像是屬性添加)。 雖然最終的設計非常簡潔,但這個想法更像是C ++ - 而不是Pythonic。
使用完全合格的路徑並不是真正的黑客攻擊; 它可能是解決這一特定問題的正確方法。 如果你想要一個較短的名字輸入,你可以做這樣的事情:
import filesystem.directory
class File(object):
def __init__(self):
self._Directory = filesystem.directory.Directory
def foo(self):
some_dir = self._Directory(...)
如果您正在測試等等,這也使得交換模擬變得微不足道。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.