catch-all*argsパラメーターは、明示的な引数の後に指定する必要があります。
def foo(func, named_arg=None, *args):
**kwキャッチオールキーワードパラメータも定義に追加する場合は、パラメータの後に追加する必要があり*argsます。
def foo(func, named_arg=None, *args, **kw):
明示的なキーワード引数とキャッチオール*args引数を混在させると、予期しない動作が発生します。任意の位置引数を使用すると同時に、リストしたキーワード引数に明示的に名前を付けることはできません。
それを超える余分な位置funcは最初に使用さnamed_argれ、位置引数としても機能します。
>>> def foo(func, named_arg = None, *args):
... print func, named_arg, args
...
>>> foo(1, 2)
1 2 ()
>>> foo(1, named_arg=2)
1 2 ()
>>> foo(1, 3, named_arg=2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: foo() got multiple values for keyword argument 'named_arg'
>>> foo(1, 2, 3)
1 2 (3,)
これは、への2番目の位置引数foo()が常にに使用されるためnamed_argです。
Python 3では、*argsパラメータをキーワード引数の前に配置できますが、これには新しい意味があります。通常、キーワードパラメータは、呼び出しシグネチャで位置引数として指定できます(たとえば、に割り当てられてfoo(somefunc, 'argument')いるように関数を呼び出します)。位置引数と名前付き引数の間にまたはプレーンを配置することにより、名前付き引数が位置として使用されないようにします。代わりに呼び出すと例外が発生します。'argument'named_arg*args*foo(somefunc, 'argument')