2012-08-02 15 views
9

変数に応じて異なる関数を呼び出すためにgetattrを使用しています。私の問題は、私は「バー」機能を持っていると私は違うとそれを呼びたいということですgetattrを使用して可変パラメータで関数を呼び出すPython

getattr(foo, bar)() 

foo.barのような関数を呼び出して、作品()

イムはそのような何かをやってパラメーター。たとえば:

def f1() : 
    pass 

def f2(param1) : 
    pass 

def f3(param1,param2) : 
    pass 

ので、「バー」はF1、F2、またはF3

可能性があり、私はこれを試してみました: は、それはparamsはassummingは「バー」関数

のために必要なすべてのパラメータを含むリストであります
getattr(foo, bar) (for p in params :) 

何あなたが好きなものを試みることができる

答えて

16

変数のparamsの長さを見るために必要で、私は、「クリーン」な解決のために見ていません:

getattr(foo, bar)(*params) 

paramsがリストまたはタプルの場合に機能します。 paramsから要素を順に展開されます。キーワード引数がある場合は、あなたもそれを行うことができます

params=(1, 2) 
foo(params[0], params[1]) 

params=(1, 2) 
foo(*params) 

は同等です。

getattr(foo, bar)(*params, **keyword_params) 

keyword_paramsは辞書です。

また、この回答は実際にgetattrから独立しています。それはどんな関数/メソッドでも動作します。

+2

OPは特に質問しませんでしたが、 '** kwargs 'も追加しました。ちょうど彼がキーワード引数を使用しようとすると、後でバグを追跡することが難しくなります。 –

+0

@ sr2222 - 追加されました。 – mgilson

関連する問題