[英]Refactoring python module configuration to avoid relative imports
這與我之前的一個問題有關。
我了解如何存儲和讀取配置文件。 有ConfigParser和ConfigObj等選項。
考慮這個假設的“蛋”模塊的結構:
eggs/ common/ __init__.py config.py foo/ __init__.py a.py
'eggs.foo.a'需要一些配置信息。 我目前正在做的是'a',
import eggs.common.config。 這樣做的一個問題是,如果'a'被移動到模塊樹中的更深層次,則相對導入會中斷。 絕對導入沒有,但它們需要您的模塊在您的PYTHONPATH上。
上述絕對導入的可能替代方案是相對導入。 因此,在'a'中,
import .common.config
在沒有討論相對絕對進口的優點的情況下,我想知道其他可能的解決方案嗎?
edit-刪除了VCS上下文
“導入...要求你的模塊在你的PYTHONPATH上”
對。
那么,設置PYTHONPATH
什么問題?
pkg_resources中的 require語句可能是你需要的。
據我所知,在此問題和之前的問題中,您只需要一條路徑就可以在sys.path
。 如果我們在談論git
作為VCS(在前一個問題中提到)時,任何時候只檢查一個分支(單個工作目錄)。 您可以根據需要隨時切換,合並分支。
我正在考慮一種更“基於推動”的解決方案。 不要導入共享對象(無論是用於配置還是某種類型的實用程序功能),而是讓頂級init導出它,並且每個中間init從上面的層導入它,並立即重新導出它。
我不確定我是否有正確的python術語,如果我錯了請糾正我。
像這樣,任何需要使用共享對象的模塊(在此示例的上下文中表示配置信息)只是在init級別從其中導入它。
這聽起來合理/可行嗎?
您可以通過將每個子目錄添加到egg/__init__.py
來欺騙導入機制:
__path__.append(__path__[0]+"\\common")
__path__.append(__path__[0]+"\\foo")
然后,您只需從egg命名空間導入所有模塊; 例如import egg.bar
(如果你有文件egg / foo / bar.py)。
請注意,foo和common不應該是一個包 - 換句話說,它們不應該包含__init__.py
文件。
該解決方案完全解決了最終移動文件的問題; 但是它會使名稱空間變得平坦,因此它可能不會那么好,特別是在大型項目中 - 就個人而言,我更喜歡全名解析。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.