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