簡體   English   中英

Python包設計和循環導入

[英]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() ),所以我有一個循環導入。

  1. 當我在file.py使用import directory ,並在directory.py import file時,它只在我的工作目錄是filesystem (即導入是本地的)時才有效。
  2. 當我在file.py使用import filesystem.directory ,並在directory.py import filesystem.file時,它工作正常,除了編寫filesystem.file.Filefilesystem.Directory.directory的審美麻煩。
  3. 奇怪的是,當我使用import filesystem.directory as directoryfrom filesystem.directory import Directory ,我得到循環導入錯誤'module' object has no attribute 'directory' 我的猜測是,雖然import ...是懶惰的, import ... as from ... import嘗試評估模塊並立即注意循環。
  4. 解決此問題的一種方法是在使用它的函數內import filesystem.directory 不幸的是,我的許多方法都使用它,並且在類中導入它似乎不起作用。

當然,這是可以解決的:吮吸它並編寫filesystem.directory.Directory ; __init__方法中的全局變量賦予__import__以供所有其他方法使用; 在同一文件中定義FileDirectory ; 等等。 但這些比解決方案更妥協,所以我的問題仍然存在:

  1. 您將如何設計文件系統,文件類使用目錄類,反之亦然?
  2. 更一般地說,您將如何處理(或避免)循環進口?

謝謝。

更新[03.07.2013] (主要是為了討論的緣故)

我遇到的另一個解決方案是某種前向聲明,在公共頭中有空filedirectory類,后面是單獨的實現(更像是屬性添加)。 雖然最終的設計非常簡潔,但這個想法更像是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM