2009-08-05 24 views
0

說我有下面的代碼:如何從該實現中獲取對模塊的引用?

from foo.bar import Foo 
from foo.foo import Bar 

__all__ = ["Foo", "Bar"] 

def iterate_over_all(): 
    ... 

我如何能實現的功能iterate_over_all(),可以動態獲取到無論是在__all__引用其中的功能實現模塊的引用代碼? IE:在iterate_over_all()我想與foo.bar.Foofoo.foo.Bar一起工作。

+0

你能澄清一下這個問題嗎?你是說你希望能夠從字符串「Foo」到對象Foo,然後到包含Foo的模塊? – mikej 2009-08-05 07:34:57

+0

我沒有得到它:你想要引用一些在__all__中的東西,例如「Foo」,所以你想從「Foo」到Foo,是嗎?!或者你想從「Foo」到foo.bar ?!部分*「...在__all__中引用模塊...」*是一種困難。 – ThomasH 2009-08-05 07:36:34

+0

對不起,傢伙,澄清補充說。 – jkp 2009-08-05 07:36:54

回答

2

請問這怎麼辦?

def iterate_over_all(): 
    for name in __all__: 
     value = globals()[name] 
     yield value # or do whatever with it 
0

eval是一種方式。例如eval("Foo")會給你Foo。不過,您也可以將Foo和Bar直接放在您的列表中,例如__all__ = [Foo, Bar]

這取決於__all__的內容來自您的實際程序的內容。

+1

嗨邁克,是的,這將工作,但根據文檔這些應該是字符串:「他導入語句使用以下約定:如果一個包的__init__.py代碼定義一個名爲__all__的列表,它將被視爲模塊名稱列表在遇到包裹導入*時應該導入。「 (http://docs.python.org/tutorial/modules.html?highlight=__all__) – jkp 2009-08-05 07:49:42

0

您可以輕鬆地指數從__all__字符串到模塊的__dict__

__dict__["Foo"] == foo.bar.Foo # -> True 
相關問題