无效的解包参数

r0n*_*0ng 0 python argument-unpacking

我正在阅读一份解释解包的在线文档(*args**kwargs)。被以下两个断言搞糊涂了,不知道为什么第二个函数无效。谁能帮助我理解原因?

def f(x, y, z):
    return [x, y, z]

t = (3,)  
d = {"z": 4}
assert f(2, *t, **d) == [2, 3, 4]
assert f(x=2, *t, **d) == [2, 3, 4]  # TypeError: f() got multiple values for argument 'x'
Run Code Online (Sandbox Code Playgroud)

参考 https://caisbalderas.com/blog/python-function-unpacking-args-and-kwargs/


注意:这个问题与TypeError: got multiple values for argument不同,因为它需要额外了解 Python 中参数解包的工作原理。

Jam*_*mes 5

您试图在关键字参数之后放置位置参数。实际的错误消息令人困惑。老实说,我很惊讶在允许关键字之后放置元组解包。

这类似于做:

f(x=2, 3, 4)
Run Code Online (Sandbox Code Playgroud)

这引发了一个SyntaxError.

我相信区别在于元组解包首先被处理并将关键字参数向右移动。所以实际上,你有这样的等价物:

f(x=2, *t, **d)
Run Code Online (Sandbox Code Playgroud)

是一样的吗

f(*t, x=2, **d)
Run Code Online (Sandbox Code Playgroud)

这就是为什么你会得到TypeError: f() got multiple values for argument 'x'