2012-11-08 37 views
2

我有一個叫做元素的包,它包含一些像按鈕,三推子,海報等東西。在Button類中,我正在做from elements import *Python:導入*僅從包中導入某些東西?

這會執行OK,並且當我嘗試print(poster)時,也可以正常工作,並按預期工作。但是,當我做print(trifader),NameError: name 'trifader' is not defined。儘管trifader和海報是在同一個包中,海報是定義的,但trifader不是?多麼奇怪。這有什麼解釋嗎?

元素包的目錄結構是這樣的:

Elements: 
    __init__.py 
    trifader.py 
    button.py 
    poster.py 

此外,一些其他的東西,是不是真的有關。

每個.py文件都包含一個名爲.py的類,例如trifader.py有一個名爲TriFader的類。

+8

也許'__all__'被使用? http://stackoverflow.com/questions/44834/can-someone-explain-all-in-python –

+1

是'trifader'類,.py文件還是包?請爲您的目錄結構提供所有'.py'文件的位置以及每個文件中定義的類名稱。沒有這些信息就很難說出任何有意義的東西。 – jozzas

+0

@jozzas已添加。另外,CodePainter,我沒有使用它。 –

回答

2

如果您__init__.py沒有__all__定義(因此限制了什麼是使用from X import *進口的),那麼你可能有它的定義已被評估之前引用的圓形import的地方,這是造成的模塊。

0

檢查循環進口。在兩個模塊都使用「導入」導入形式的情況下,循環導入很好。當第二個模塊想要從第一個模塊(「從模塊導入名稱」中取出一個名稱)並且導入位於頂層時,它們會失敗。這是因爲第一個名字尚不可用,因爲第一個模塊正在忙於導入第二個名字。其次,如果在調用導入時在函數內部調用導入,則第一個模塊將完成初始化,第二個模塊可以導入。

+0

當兩個都使用非星形「import」形式時,循環導入不一定很好 - 如果在兩個模塊中都有類定義需要來自另一個模塊的名字,你也會遇到問題。唯一的情況是循環導入是「好的」,那就是當名稱不需要直到運行時才被解析(當兩個模塊都已經實例化時),而不是編譯時(當它們的成員用於另一個實例時定義)。 –

+0

是的你是對的。我錯過了將其納入我的答案。 –