我有這個包:蟒蛇 - 在同一個目錄的絕對進口的模塊
mypackage/
__init__.py
a.py
b.py
我想從模塊導入的事情模塊B,是否有意義模塊寫b
from mypackage.a import *
,或者我應該只使用
from a import *
兩個選項會的工作,我只是想知道這是更好的(第二品牌因爲它處於同一級別,但我正在考慮第1個以避免衝突,例如,如果系統是從包含名爲a.py的文件的文件夾運行的。
我有這個包:蟒蛇 - 在同一個目錄的絕對進口的模塊
mypackage/
__init__.py
a.py
b.py
我想從模塊導入的事情模塊B,是否有意義模塊寫b
from mypackage.a import *
,或者我應該只使用
from a import *
兩個選項會的工作,我只是想知道這是更好的(第二品牌因爲它處於同一級別,但我正在考慮第1個以避免衝突,例如,如果系統是從包含名爲a.py的文件的文件夾運行的。
您可以安全地使用編號2,因爲不應該有任何衝突 - 您將始終從當前包的相同包中導入模塊。請注意,如果您的模塊與其中一個標準庫模塊具有相同的名稱,則它將被導入而不是標準模塊。從the documentation:
當導入一個名爲
spam
模塊,解釋器首先搜索 與該名稱的內置模塊。如果找不到,則它在 變量sys.path
給出的目錄列表中搜索 以獲得名爲spam.py
的文件。sys.path
從這些位置初始化:
- 包含輸入腳本(或當前目錄)的目錄。
PYTHONPATH
(目錄名稱列表,其語法與- shell變量
PATH
相同)。- 安裝依賴的默認值。
初始化後,Python程序可以修改
sys.path
。 包含正在運行的腳本的 目錄放置在搜索路徑的開頭 之前,位於標準庫路徑之前。這意味着 該目錄中的腳本將被加載,而不是在庫目錄中具有相同名稱的 模塊。這是一個錯誤,除非打算更換 。有關更多 信息,請參見部分Standard Modules。
選項from mypackage.a import *
可用於整個項目的一致性原因。在某些模塊中,無論如何您都必須進行絕對導入。因此,您不必考慮模塊是否在同一個軟件包中,只需在整個項目中使用統一的樣式。此外,這種方法更可靠和可預測。
Python style guidelines不推薦使用相對導入:
的封裝內進口相對進口高度氣餒。 始終對所有導入使用絕對包路徑。即使現在,在Python 2.5中完全實現了 PEP 328,但其相對導入的顯式 風格受到阻礙;絕對進口更便攜,通常更具可讀性。
由於python 2.5引入了intra-package relative imports的新語法。現在您可以參考.
來查看當前模塊,並且參考模塊上面的1個級別來參考..
。
from . import echo
from .. import formats
from ..filters import equalizer
您應該使用from mypackage.a import things, you, want
。
這裏有兩個問題,主要是相對vs絕對導入,其語義在Python 3中進行了更改,並且可以選擇在Python 2.6和2.7中使用,使用導入__future__
。通過使用mypackage.a,您可以保證您將獲得您真正想要的代碼,並且可以在將來的Python版本上可靠地工作。
第二件事是你應該避免導入*,因爲它可能會掩蓋其他代碼。如果a.py文件獲得了一個名爲sum
的函數,該怎麼辦?它會默默地覆蓋內置的一個。在其他模塊中導入自己的代碼時,這是非常糟糕的,因爲您可能已經重用了變量或函數名稱。
因此,您應該只導入您需要的特定功能。如果在源代碼中使用pyflakes,則會在發生潛在衝突時發出警告。
+1。順便說一句,'從__future__ import absolute_import'也適用於python 2.5。 – jfs 2012-08-15 19:12:05
你怎麼知道無論真的是不是與內建的碰撞?由於某種原因隱含的相對進口被殺害,它們並不安全。 – MatthewWilkes 2012-08-14 13:56:58
你是對的,一個內置模塊將被我們自己擁有的相同名稱所掩蓋。 – 2012-08-14 14:25:14
「Python風格指南不建議採用第一種方法:」 對我來說,看起來他們確實推薦第一個 「對所有導入始終使用絕對包路徑」 – banana 2012-08-15 15:37:49