2012-08-14 69 views
12

我有這個包:蟒蛇 - 在同一個目錄的絕對進口的模塊

mypackage/ 
    __init__.py 
    a.py 
    b.py 

我想從模塊導入的事情模塊B,是否有意義模塊寫b

from mypackage.a import * 

,或者我應該只使用

from a import * 

兩個選項會的工作,我只是想知道這是更好的(第二品牌因爲它處於同一級別,但我正在考慮第1個以避免衝突,例如,如果系統是從包含名爲a.py的文件的文件夾運行的。

回答

6

您可以安全地使用編號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 
+3

你怎麼知道無論真的是不是與內建的碰撞?由於某種原因隱含的相對進口被殺害,它們並不安全。 – MatthewWilkes 2012-08-14 13:56:58

+0

你是對的,一個內置模塊將被我們自己擁有的相同名稱所掩蓋。 – 2012-08-14 14:25:14

+0

「Python風格指南不建議採用第一種方法:」 對我來說,看起來他們確實推薦第一個 「對所有導入始終使用絕對包路徑」 – banana 2012-08-15 15:37:49

5

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

這裏有兩個問題,主要是相對vs絕對導入,其語義在Python 3中進行了更改,並且可以選擇在Python 2.6和2.7中使用,使用導入__future__。通過使用mypackage.a,您可以保證您將獲得您真正想要的代碼,並且可以在將來的Python版本上可靠地工作。

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

因此,您應該只導入您需要的特定功能。如果在源代碼中使用pyflakes,則會在發生潛在衝突時發出警告。

+2

+1。順便說一句,'從__future__ import absolute_import'也適用於python 2.5。 – jfs 2012-08-15 19:12:05