2009-08-05 12 views
0

は、私は次のコードを持って言う:その実装内から実装されているモジュールへの参照を取得するにはどうすればよいですか?

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

__all__ = ["Foo", "Bar"] 

def iterate_over_all(): 
    ... 

どのように私は動的に機能が実装されている__all__モジュールで参照されているものへの参照を取得することができます機能iterate_over_all()にコードを実装することができますか? IE:iterate_over_all()foo.bar.Foofoo.foo.Barで作業したいと思います。

+0

少し質問を明確にすることはできますか?文字列 "Foo"からオブジェクトFooに移動し、Fooを含むモジュールに移動したいとしていますか? – mikej

+0

私はそれを得ていません:あなたは__all__にある何かへの参照が必要です。 "Foo"、 "Foo"からFooに行きたいので、そうでしょうか?または "Foo"からfoo.barに行きたいですか? * "...モジュールで__all__で参照されている部分は..." *はちょっと難しいです。 – ThomasH

+0

申し訳ありませんが、清算が追加されました。 – jkp

答えて

2

はこれを行うだろうか?

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

あなたは正しいのですが、* globals()*は実際には\\ \ dict \ _ \ _ *にしようとするよりもうれしく、この質問の目的のためには正しい参照と同じキーを持つようです。 – ThomasH

0

evalは片道です。例えばeval("Foo")Fooとなります。しかし、FooとBarをあなたのリストに直接入れることもできます。 __all__ = [Foo, Bar]

実際のプログラムでは__all__の内容がどこに由来するかによって異なります。

+1

こんにちはMikeさん、これはうまくいくでしょうが、ドキュメントによれば、これらは文字列でなければなりません: "importステートメントは以下の規則を使用します:パッケージの__init__.pyコードが__all__という名前のリストを定義する場合、パッケージimport *が発生したときにインポートする必要があります。 (http://docs.python.org/tutorial/modules.html?highlight=__all__) – jkp

+0

リンクをありがとう。 globals()の中でアイテムを探しているのですか?例えばglobals()["Foo"] – mikej

+0

@mikejはい、そうです、マーティンの答えを見てください。 – ThomasH

0

あなたは簡単に、モジュールの__dict____all__から文字列を含むインデックスすることができます

__dict__["Foo"] == foo.bar.Foo # -> True 
+1

トーマス:素晴らしい答えですが、そのモジュールのdictへの参照を取得する方法は? – jkp

+0

ああ、私は思った* \ _ \ _ dict \ _ \ _ *すぐに利用できるようになります...それを得る方法です:* sys.modules [globals()[\ _ \ _ name \ _ \ _]] \ _ \ _ dict \ _ \ _ *。 (そう、私はモジュールレベルに* self *があったかった...)。 – ThomasH

+0

* \ _ \ _ name \ _ \ _ *や* \ _ \ _ file \ _ \ _ *のように、他のモジュールの属性を自由に利用できるというのは実際に面白いですが、* \ _ \ _ dict \ _ \ _ *はそうではありません。 。 – ThomasH