Function argument unpacking error
Look at this example (using python 2.7.6):
>>> def func(a, b, c, d):
print a, b, c, d
>>> func(1, c = 3, *(2,), **{'d':4})
1 2 3 4
Up to here, this is fine. But, why the following call fails?
>>> func(1, b = 3, *(2,), **{'d':4})
Traceback (most recent call last):
File "<pyshell#69>", line 1, in <module>
func(1, b = 3, *(2,), **{'d':4})
TypeError: func() got multiple values for keyword argument 'b'
1 ответ
Решение
Это может быть лучше понято с другой подписью функции
>>> def func(*args, **kw):
print(args, kw)
>>> func(1, b = 3, *(2,), **{'d':4})
(1, 2) {'b': 3, 'd': 4}
Таким образом, позиционные аргументы объединяются, как и ключевые аргументы.
Используя оригинальную подпись, это означает, что оба 2
а также 3
будет назначен на b
, который не действителен.
PS: поскольку простая распаковка кортежей не предоставляет имен, значения будут рассматриваться как позиционные аргументы.