Ключевое слово аргумент в распаковке списка аргументов / случаев dict в Python - PullRequest
5 голосов
/ 29 июня 2010

Для 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() got multiple values for keyword argument 'x'

Почему это?

1 Ответ

9 голосов
/ 29 июня 2010

Независимо от порядка, в котором они указаны, позиционные аргументы назначаются до аргументов ключевого слова.В вашем случае позиционные аргументы (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'
...