2009-04-23 9 views
0

与えられた引数で指定された関数を呼び出すコードを少し書いてみたいと思います。 EG:'関数呼び出し関数'の実装

def caller(func): 
    return func() 

は、しかし、私もやりたい何呼び出し側は「指定された引数を持つ「FUNC」(もしあれば)を呼び出すように「呼び出し元」関数にオプションの引数を指定しています。

def caller(func, args): 
# calls func with the arguments specified in args 

これを行うには単純な、pythonic方法はありますか?

+0

と同じです。あなたは何かを過度に一般化していないと確信していますか? –

+0

@Greg:ありがとうございます。 :)プロダクションコードではありません。私は学校の仕事のために何かをテストするつもりです。私は「パイソンでそれを行う方法がなければなりません」と考えました。 私は尋ねました。 :) – theycallmemorty

+0

ねえ!これは完全に正常です!私はこれを常時プロダクションコードに使用しています。 Useecase:プロトコル実装:{トークン:関数}の辞書は、トークンと照合し、関数を呼び出します。トークンが明示的な状態の場合は、状態マシンがあります。 Pythonはこのために_made_です!まったく卑劣なメタ。私はあなたのコメントをdownvoteすることを願っグレッグ:-) – brice

答えて

12

arbitrary argument listsunpacking argument listsを使用してこれを行うことができます。はあなたがが、それを行うために必要性を感じ、なぜ

>>> def caller(func, *args, **kwargs): 
...  return func(*args, **kwargs) 
... 
>>> def hello(a, b, c): 
...  print a, b, c 
... 
>>> caller(hello, 1, b=5, c=7) 
1 5 7 

わかりません。

7

これはすでにapply関数として存在しますが、新しい* argsおよび** kwargs構文のために廃止されていると考えられます。

>>> def foo(a,b,c): print a,b,c 
>>> apply(foo, (1,2,3)) 
1 2 3 
>>> apply(foo, (1,2), {'c':3}) # also accepts keyword args 

ただし、*と**の構文は一般的により良い解決策です。上記は、

>>> foo(*(1,2), **{'c':3}) 
関連する問題