Аргумент ключевого слова в распаковке списка аргументов/dict случаи в Python

Для 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'

Почему это?

5
задан prosseek 29 June 2010 в 13:35
поделиться

1 ответ

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

Похожие вопросы: