我正在读一份在线文档,解释解压(*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'参考https://caisbalderas.com/blog/python-function-unpacking-args-and-kwargs/
注意:这个问题不同于TypeError: got multiple values for argument,因为它需要对参数解包装在Python中的工作方式有更多的了解。
发布于 2020-01-01 22:24:48
您正在尝试将位置参数放在关键字参数之后。实际的错误消息令人困惑。我真的很惊讶,放置元组解压后,关键字是允许的。
它类似于这样做:
f(x=2, 3, 4)这会引发一个SyntaxError。
我相信不同之处在于,元组解包首先被处理,并将关键字参数移到右边。因此,有效地,您具有以下等价性:
f(x=2, *t, **d)这和
f(*t, x=2, **d)这就是为什么你要得到TypeError: f() got multiple values for argument 'x'
https://stackoverflow.com/questions/59556558
复制相似问题