2009-10-17 65 views
2

我有一個看起來像這樣的目錄結構:如何讓這些相對導入在Python 3中工作?

project/ 
     __init__.py 
     foo/ 
      __init.py__ 
      first.py 
      second.py 
      third.py 
     plum.py 

project/foo/__init__.py我匯入first.pysecond.pythird.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)什麼也沒有顯示。

+0

是否沒有通配符進口工作? (也就是說,你能明確導入WonderfulThing嗎?)相對導入本身可能會很棘手。我建議你在繼續使用__all__之前確保它正在工作。 – 2009-10-17 02:59:35

+2

'__all__'可以包含任何對象的名稱。他們不必是(通常不是)模塊。 – 2009-10-17 03:04:09

+0

「不幸的是,dir(foo)什麼也沒有顯示。」 什麼都沒有!?對我來說,它顯示'['WonderfulThing','__all__','__builtins__','__doc__','__file__','__name__','__package__','__path__','first']' 您必須做某件事從根本上說是錯誤的,或者你沒有向我們展示實際的代碼,因爲你描述的工作很好。 – 2009-10-17 10:29:20

回答

3

編輯:我誤解了這個問題:沒有__all__不僅限於模塊。

一個問題是爲什麼你想做一個相對導入。在這裏做from project.foo import *沒有任何問題。其次,對foo的__all__限制不會妨礙你做from project.foo.first import WonderfulThing,或者只是from .first import WonderfulThing,這仍然是最好的方式。

如果你真的想導入了很多東西,它可能是最好做from project import foo,然後用事情foo.WonderfulThing的,而不是做一個import *,然後直接使用WonderfulThing

但是回答你直接的問題,從__init__文件導入second.py你這樣做:

from . import WonderfulThing 

from . import *