2010-03-25 71 views
6

我有一個Python包mymodule和一個子包utils(即一個包含每個函數的模塊的子目錄)。這些功能與它們所在的文件/模塊具有相同的名稱。從一個同名的Python模塊中導入一個函數/類

我希望能夠訪問如下功能,

from mymodule.utils import a_function

奇怪但是,有時候我可以導入使用上述符號的功能,但其他時間我不能。我一直無法弄清楚爲什麼(最近,例如,我重命名了一個函數和它所在的文件,並在utils.__init__.py文件中反映了該重命名,但它不再作爲函數(而是作爲模塊)導入到一個文件中我的腳本。

utils.__init__.py讀取類似,

__all__ = ['a_function', 'b_function' ...] 
from a_function import a_function 
from b_function import b_function 
... 

mymodule.__init__.py沒有提及utils

想法?

回答

7

做你的utils的功能需要導入其他utils函數? (或導入導入其他utils函數的其他模塊)。假設例如a_function.py包含包含「from mymodule.utils import b_function」。這是你的utils.py有一堆額外的評論:

# interpreter is executing utils.py 
# Right now, utils.a_function and utils.b_function are modules 

# The following line executes the a_function module, 
# then rebinds a_function to a_function.a_function 
from a_function import a_function 

# The following line executes the b_function module, 
# then rebinds b_function to b_function.b_function 
from b_function import b_function 

當a_function模塊首先由utils.py進口,utils.b_function是一個模塊不是一個函數。任何在執行最後一行之前聲明「from mymodule.utils import b_function」的模塊最終將引用b_function模塊而不是b_function函數。

一般而言,我發現from somemodule import something成語充滿了任何大型項目的風險。這對短腳本很好,但是一旦你開始引入循環導入依賴關係,就會遇到問題,需要小心使用它。

作爲安全和節省打字之間的妥協,我會使用from mymodule import utils然後致電utils.a_function()。這樣,您將始終獲得綁定到utils.a_function的對象,而不是在導入過程中綁定到utils.a_function的任何事物。

+0

那麼'import mymodule.utils as utils'和'from mymodule import utils'有什麼區別? – 2010-03-26 01:19:12

+0

@Mike DeSimone:好點。我相應地更新了我的答案。 – 2010-03-26 01:31:26

相關問題