Берем простую функцию:
def func(a, *args, **kwargs):
print a
print args
print kwargs
вызываем:
>>> func(1, 2, 3, b=4, c=5)
1
(2, 3)
{'c': 5, 'b': 6}
всё отлично… теперь аргументы 2 и 3 объединяем в кортеж, а последние два опускаем (они больше не нужны):
args = (2, 3)
>>> func(1, *args)
1
(2, 3)
{}
тут тоже всё как и должно быть. Несложно заметить, что вызовы func(1, 2, 3) и func(1, *args) - это по сути одно и то же. Теперь пробуем заведомо неправильный вызов с именованным аргументов в начале и ожидаемо получаем ошибку:
>>> func(a=1, 2, 3)
SyntaxError: non-keyword arg after keyword arg
И теперь вопрос: почему, если вызвать функцию следующим образом, то сообщение об ошибке другое?
args = (2, 3)
>>> func(a=1, *args)
TypeError: func() got multiple values for keyword arguments 'a'
Откуда здесь множественные значения переменной ‘a’?