回答:
他の答えを少し拡張するには:
行:
def wrapper(func, *args):
の横の* args
は、「指定された残りのパラメーターを取得し、それらをリストと呼ばれるリストに入れる」ことを意味しますargs
。
行:
func(*args)
ここの* args
は、「argsと呼ばれるこのリストを取り、残りのパラメーターに「アンラップ」することを意味します。
したがって、次のことができます。
def wrapper1(func, *args): # with star
func(*args)
def wrapper2(func, args): # without star
func(*args)
def func2(x, y, z):
print x+y+z
wrapper1(func2, 1, 2, 3)
wrapper2(func2, [1, 2, 3])
ではwrapper2
、リストは明示的に渡さargs
れますが、どちらのラッパーにもリストが含まれています[1,2,3]
。
def wrapper(func, *args)
はmethod(params object[] args)
C#にあるものです。
*args
関数定義の最後の引数でなければならないことに注意してください。
The * next to args means "take the rest of the parameters given and put them in a list called args".
リストではなくタプルに入れます。
関数をラップする最も簡単な方法
func(*args, **kwargs)
... 内部でfunc()を呼び出すラッパーを手動で作成します。
def wrapper(*args, **kwargs):
# do something before
try:
return func(*a, **kwargs)
finally:
# do something after
Pythonでは関数はオブジェクトなので、別の関数の引数としてその名前を渡して返すことができます。また、任意の関数anyFunc()のラッパージェネレーターを作成することもできます。
def wrapperGenerator(anyFunc, *args, **kwargs):
def wrapper(*args, **kwargs):
try:
# do something before
return anyFunc(*args, **kwargs)
finally:
#do something after
return wrapper
Pythonでは、関数のすべての引数がわからない、または名前を付けたくない場合は、引数のタプルを参照できます。これは、その名前で示され、その後に括弧内のアスタリスクが前に付きます。関数名:
*args
たとえば、任意の数の引数を取る関数を定義できます。
def testFunc(*args):
print args # prints the tuple of arguments
Pythonでは、関数の引数をさらに操作できます。関数がキーワード引数を取ることを許可できます。関数本体内で、キーワード引数は辞書に保持されます。関数名の後の括弧内に、この辞書は2つのアスタリスクとそれに続く辞書の名前で示されます。
**kwargs
キーワード引数辞書を出力する同様の例:
def testFunc(**kwargs):
print kwargs # prints the dictionary of keyword arguments
可変長引数には* argsおよび** kwargs構文を使用できます。
そして公式のPythonチュートリアルから
http://docs.python.org/dev/tutorial/controlflow.html#more-on-defining-functions
あなたの質問に対する文字通りの答え(正確にあなたが尋ねたことをするため、ラッパーのみを変更し、関数や関数呼び出しは変更しない)は単に行を変更することです
func(args)
読む
func(*args)
これは、指定されたリスト(この場合はargs
)を受け取り、その内容を位置引数として関数に渡すようにPythonに指示します。
このトリックは、関数呼び出しの「両側」で機能するため、関数は次のように定義されます。
def func2(*args):
return sum(args)
あなたが投げるのと同じくらい多くの位置引数を受け入れ、それらをすべてと呼ばれるリストに入れることができますargs
。
これが少しわかりやすくなることを願っています。これはの**
代わりにを使用して、dicts / keyword引数でもすべて可能です*
。
以前の回答に少し追加しました。問題の解決策を見つけることができなかったためです。これは、新しい質問を開く価値はありませんが、ここに導いてくれました。
以下はlists
、zip()
とを組み合わせた小さなコードスニペット*args
で、未知の量の関数と未知の量の引数を処理できるラッパーを提供します。
def f1(var1, var2, var3):
print(var1+var2+var3)
def f2(var1, var2):
print(var1*var2)
def f3():
print('f3, empty')
def wrapper(a,b, func_list, arg_list):
print(a)
for f,var in zip(func_list,arg_list):
f(*var)
print(b)
f_list = [f1, f2, f3]
a_list = [[1,2,3], [4,5], []]
wrapper('begin', 'end', f_list, a_list)
それ、覚えておいてzip()
、不均等な長さのリストの安全確認を提供見ないジップイテレータはPythonで同じ長さのために主張します。