It can be better understood with another function signature
>>> def func(*args, **kw):
print(args, kw)
>>> func(1, b = 3, *(2,), **{'d':4})
(1, 2) {'b': 3, 'd': 4}
So, the positional arguments are put together and so are the keyword arguments.
Using the original signature, it means both 2
and 3
will be assigned to b
, which is not valid.
PS: Because a simple tuple unpacking does not provide names, the values will be treated as positional arguments.