2013-07-18 36 views
2

我對Python的導入機制沒有很清楚的理解。有一件令我困惑的事情是:當python導入模塊時,它是否也會導入導入的名稱。這裏是代碼:當python導入時,它是否在'import'語句中導入名字?

# A.py 
def A_func(): 
    pass; 

# B.py 
from A import *; 
def B_func(): 
    pass; 

# C.py 
from B import *; 
def C_func(): 
    # I can use B_func, OK, no problem. 
    # I can use A_func here, is import recursive? 

如果python遞歸導入,我的代碼是不好的實踐?如果我添加

from A import *; 

to C.py?它是否通過導入兩次導致任何開銷?或者我應該避免「從xx導入*」並只導入所需的名稱?

謝謝!

+1

'import *'是(總是)一個不好的做法 – blablatros

回答

2

代碼僅在第一次爲模塊調用import時執行。後續導入只複製名稱和引用。

話雖如此,不要導入*

+0

如果在模塊A中導入名稱X,如果我將所有內容導入到A中,則可以訪問該名稱X,對嗎? – NeoWang

+1

取決於「A .__ all__」中的內容。 –

-1

你只能在C.py中使用B_func。您將無法訪問A_Func。如果您想使用A中的定義,您必須從A中導入。編輯:對不起,我的不好。我錯誤地理解了

+0

我曾經想過,但是...我可以在C中使用A_func,因爲A_func是由B中的*導入的。這不符合我對進口的理解,因此這個問題。 – NeoWang

+0

@manish這是不正確的。如果'B.py'將'A.py'的東西輸入到它的名稱空間中,它就在名稱空間中,並且可以從別處導入。儘管在大多數情況下這不是很好的風格。如果'C.py'需要'A.py'中的某個東西,它應該直接從那裏導入它。 – glglgl