24

barと呼ばれるモジュール内に関数があるとしましょうfoo.py。foo.py内のどこかで、文字列「bar」からbar()を呼び出せるようにしたいと思います。それ、どうやったら出来るの?

# filename: foo.py
import sys

def bar():
  print 'Hello, called bar()!'

if __name__ == '__main__':
  funcname = 'bar'
  # Here I should be able to call bar() from funcname

Pythonには「getattr」という組み込み関数がいくつか存在することを私は知っています。ただし、最初のパラメータは「モジュールオブジェクト」である必要があります。現在のモジュールの「モジュールオブジェクト」を取得するにはどうすればよいですか?

4

2 に答える 2

41

globalsおそらく理解しやすいでしょう。現在のモジュールを返す__dict__ので、次のことができます。

func_I_want = globals()['bar']  #Get the function
func_I_want()    #call it

モジュールオブジェクトが本当に必要な場合は、次の場所から取得できsys.modulesます(ただし、通常は必要ありません)。

import sys.modules
this_mod = sys.modules[__name__]
func = getattr(this_mod,'bar')
func()

一般に、なぜこれを行いたいのかを自問する必要があることに注意してください。これにより、文字列を介して任意の関数を呼び出すことができます。これはおそらくユーザー入力です...誤ってユーザーに間違った関数へのアクセスを許可した場合、これは潜在的に悪い副作用をもたらす可能性があります。

于 2012-10-11T18:19:43.530 に答える
16

呼び出したい関数のマッピングを保持する辞書を使用します。

if __name__ == '__main__':
  funcnames = {'bar': bar}
  funcnames['bar']()
于 2012-10-11T18:20:39.303 に答える