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: поскольку простая распаковка кортежей не предоставляет имен, значения будут рассматриваться как позиционные аргументы.

Другие вопросы по тегам