簡體   English   中英

python - 同一目錄中模塊的絕對導入

[英]python - absolute import for module in the same directory

我有這個包裹:

mypackage/
    __init__.py
    a.py
    b.py

我想從模塊a導入到模塊b的東西,在模塊b中寫入是否有意義

from mypackage.a import *

或者我應該使用

from a import *

兩個選項都可以工作,我只是想知道哪個更好(第二個有意義,因為它處於同一級別,但我正在考慮第一個以避免沖突,例如,如果系統從包含名為的文件的文件夾運行a.py)。

您可以安全地使用數字2,因為不應該有任何沖突 - 您將始終從與當前包相同的包中導入模塊。 請注意,如果您的模塊與其中一個標准庫模塊具有相同的名稱,則將導入該模塊而不是標准庫模塊。 文檔

導入名為spam的模塊時,解釋器首先搜索具有該名稱的內置模塊。 如果未找到,則會在變量sys.path給出的目錄列表中搜索名為spam.py的文件。 sys.path從這些位置初始化:

  • 包含輸入腳本(或當前目錄)的目錄。
  • PYTHONPATH (目錄名列表,語法與
  • shell變量PATH )。
  • 依賴於安裝的默認值。

初始化后,Python程序可以修改sys.path 包含正在運行的腳本的目錄位於搜索路徑的開頭,位於標准庫路徑之前。 這意味着將加載該目錄中的腳本,而不是庫目錄中的同名模塊。 除非有意更換,否則這是一個錯誤。 有關更多信息,請參見標准模塊一節

from mypackage.a import *的選項可用於整個項目的一致性原因。 在某些模塊中,無論如何都必須進行絕對導入。 因此,您不必考慮模塊是否在同一個包中,只需在整個項目中使用統一的樣式。 此外,這種方法更可靠,更可預測。

Python樣式指南不建議使用相對導入:

不鼓勵進行包裝內進口的相對進口。 始終對所有導入使用絕對包路徑。 即使現在PEP 328已經在Python 2.5中完全實現,但它的顯式相對導入風格仍然是不鼓勵的; 絕對導入更便攜,通常更具可讀性。

從python 2.5開始,引入了用於包內相對導入的新語法。 現在你可以. 引用當前模塊和..指模塊為1級以上。

from . import echo
from .. import formats
from ..filters import equalizer

你應該使用from mypackage.a import things, you, want

這里有兩個問題,主要是相對vs絕對導入,其語義在Python 3中發生了變化,並且可以選擇在使用__future__ import的Python 2.6和2.7中使用。 通過使用mypackage.a,您可以保證獲得實際需要的代碼,並且可以在未來的Python版本上可靠地運行。

第二件事是你應該避免import *,因為它可能會掩蓋其他代碼。 如果a.py文件獲得了一個名為sum的函數怎么辦? 它會默默地覆蓋內置的。 在其他模塊中導入自己的代碼時尤其如此,因為您可能已經重用了變量或函數名稱。

因此,您應該只導入所需的特定功能。 在您的源代碼上使用pyflakes將在您有潛在沖突時發出警告。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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