5

Python の場合、次のように展開引数を使用できます。

def hello(x, *y, **z):
    print 'x', x
    print 'y', y
    print 'z', z

hello(1, *[1,2,3], a=1,b=2,c=3)
hello(1, *(1,2,3), **{'a':1,'b':2,'c':3})
x = 1
y = (1, 2, 3)
z = {'a': 1, 'c': 3, 'b': 2}

しかし、次のようにキーワード引数を使用するとエラーが発生しました。

hello(x=1, *(1,2,3), **{'a':1,'b':2,'c':3})
TypeError: hello() がキーワード引数 'x' に複数の値を取得しました

どうしてこれなの?

4

1 に答える 1

9

指定された順序に関係なく、位置引数はキーワード引数より前に割り当てられます。あなたの場合、位置引数は(1, 2, 3)で、キーワード引数はx=1, a=1, b=2, c=3です。位置引数が最初に割り当てられるため、パラメーターxは 1 を受け取り、キーワード引数には適格ではなくなります。構文的に位置引数はキーワード引数の後に指定されるため、これは少し奇妙に聞こえますが、それでも「位置引数→キーワード引数」の順序は常に守られています。

より簡単な例を次に示します。

>>> def f(x): pass
... 
>>> f(1, x=2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: f() got multiple values for keyword argument 'x'
>>> f(x=2, *(1,))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: f() got multiple values for keyword argument 'x'
于 2010-06-29T13:41:05.800 に答える