【发布时间】:2016-11-09 21:43:00
【问题描述】:
def f(a, b, *args):
return (a, b, args)
f(a=3, b=5)
(3, 5, ())
而:
f(a=3, b=5, *[1,2,3])
TypeError: got multiple values for argument 'b'
为什么会这样?
有什么特别的原因吗?
【问题讨论】:
-
有趣,异常给出了 python 2.7 中的“获取关键字参数'a'的多个值”和 python 3.5 中的“获取参数'b'的多个值”
-
@cdarke 当使用关键字参数时,python 会构建一个
dict来存储这些参数。dicts 没有可靠的订单。错误消息中的差异反映了这一点:使用 python2.7 时,hash make 使得a是第一个被迭代的键,而在 python3.5 上,它恰好是b。但这完全取决于字典的构建方式等。 -
@Bakuriu:我意识到了这一点,但我觉得无论内部实现如何,都应该努力获得一致且有用的错误消息。 “真正的”问题是在位置参数之前使用关键字,这是应该检测和报告的错误。
-
@cdarke 所以您想在使用该语法时获得
SyntaxError?这与大多数 python 不一致,大多数错误都是在运行时引发的。此外,在某些情况下,这样的调用会很好,例如f(a=3, b=5, *[])不是问题。同样在一般情况下,如果kwargs和args中的参数不重叠,f(**kwargs, *args)仍然可以。最后:python 永远无法确定实际调用的是哪个函数,因此无法先验地确定是否存在重叠。
标签: python python-3.x args optional-arguments