我有一個看起來像這樣的目錄結構:如何讓這些相對導入在Python 3中工作?
project/
__init__.py
foo/
__init.py__
first.py
second.py
third.py
plum.py
在project/foo/__init__.py
我匯入first.py
,second.py
和third.py
類,並把它們在__all__
。
有一個在first.py
一類名爲WonderfulThing
我想second.py
使用,並希望通過foo
進口*
要導入的。 (這是這個問題,爲什麼我想這樣做的範圍之外,假設我有一個很好的理由。)
在second.py
我試過from .foo import *
,from foo import *
和from . import *
在這些情況都不是WonderfulThing
進口。我也試過from ..foo import *
,這引發了一個錯誤「試圖相對導入超出頂層包」。
我已閱讀過文檔和PEP,但我無法弄清楚如何完成這項工作。任何援助將不勝感激。
澄清/編輯:似乎我可能誤解了__all__
的方式在包中工作。我用它一樣的模塊,
from .first import WonderfulThing
__all__ = [ "WonderfulThing" ]
但看着再次文檔似乎表明__all__
只可在包被用來指定模塊默認情況下,進口的姓名;似乎沒有任何方法可以包含任何不是模塊的東西。
這是正確的嗎?
編輯:非通配符導入失敗(cannot import name WonderfulThing
)。嘗試from . import foo
失敗,但import foo
工作。不幸的是,dir(foo)
什麼也沒有顯示。
是否沒有通配符進口工作? (也就是說,你能明確導入WonderfulThing嗎?)相對導入本身可能會很棘手。我建議你在繼續使用__all__之前確保它正在工作。 – 2009-10-17 02:59:35
'__all__'可以包含任何對象的名稱。他們不必是(通常不是)模塊。 – 2009-10-17 03:04:09
「不幸的是,dir(foo)什麼也沒有顯示。」 什麼都沒有!?對我來說,它顯示'['WonderfulThing','__all__','__builtins__','__doc__','__file__','__name__','__package__','__path__','first']' 您必須做某件事從根本上說是錯誤的,或者你沒有向我們展示實際的代碼,因爲你描述的工作很好。 – 2009-10-17 10:29:20