モジュールの名前(文字列)を使った関数の呼び出し

Pythonのプログラムで、関数名の文字列を与えて関数を呼び出すには、どのような方法がありますか? 例えば、モジュール foo があって、内容が "bar" である文字列があるとします。このとき、foo.bar()を呼び出すには、どのようにすればよいでしょうか。

関数の戻り値を取得する必要があるので、単に eval を使うだけではありません。私はevalを使って、その関数呼び出しの結果を返すテンポラリ関数を定義することで方法を見つけましたが、'もっとエレガントな方法があることを期待しています。

ソリューション

モジュール foo のメソッド bar を想定しています。

import foo
method_to_call = getattr(foo, 'bar')
result = method_to_call()

2行目と3行目を以下のように短縮することができます。

result = getattr(foo, 'bar')()

に短縮することができます(その方がより意味がある場合)。

クラスのインスタンスにバインドされたメソッドや、モジュールレベルのメソッド、クラスのメソッドなどに、この方法で getattr を使用することができます......数え切れません。

解説 (12)
locals()["myfunction"]()

または

globals()["myfunction"]()

localsは、現在のローカル・シンボル・テーブルを持つ辞書を返します。globalsは、グローバル・シンボル・テーブルを含む辞書を返します。

解説 (4)

Patrickの解決策が一番すっきりしていると思います。 モジュールも動的にピックアップする必要がある場合は、次のようにインポートします。

module = __import__('foo')
func = getattr(module, 'bar')
func()
解説 (6)