[英]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.