簡體   English   中英

重構python模塊配置以避免相對導入

[英]Refactoring python module configuration to avoid relative imports

這與我之前的一個問題有關。

我了解如何存儲和讀取配置文件。 ConfigParserConfigObj等選項。

考慮這個假設的“蛋”模塊的結構:

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.

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