-1

*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/

4

1 回答 1

3

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

这类似于做:

f(x=2, 3, 4)

这引发了SyntaxError.

我相信不同之处在于首先处理元组解包并将关键字参数向右移动。如此有效地,你有这个等价物:

f(x=2, *t, **d)

是一样的吗

f(*t, x=2, **d)

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

于 2020-01-01T22:24:48.630 回答