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')