Python 函数参数解包错误
看看这个示例(使用python 2.7.6): 到目前为止,这还不错。但是,为什么下面的调用失败Python 函数参数解包错误,python,argument-unpacking,Python,Argument Unpacking,看看这个示例(使用python 2.7.6): 到目前为止,这还不错。但是,为什么下面的调用失败 >>> func(1, b = 3, *(2,), **{'d':4}) Traceback (most recent call last): File "<pyshell#69>", line 1, in <module> func(1, b = 3, *(2,), **{'d':4}) TypeError: func() got multi
>>> func(1, b = 3, *(2,), **{'d':4})
Traceback (most recent call last):
File "<pyshell#69>", line 1, in <module>
func(1, b = 3, *(2,), **{'d':4})
TypeError: func() got multiple values for keyword argument 'b'
func(1,b=3,*(2,),***{'d':4})
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
func(1,b=3,*(2,),***{'d':4})
TypeError:func()为关键字参数“b”获取了多个值
使用另一个函数签名可以更好地理解它
>>> def func(*args, **kw):
print(args, kw)
>>> func(1, b = 3, *(2,), **{'d':4})
(1, 2) {'b': 3, 'd': 4}
因此,位置参数和关键字参数放在一起
使用原始签名,意味着2
和3
都将分配给b
,这是无效的
PS:因为简单的元组解包不提供名称,所以这些值将被视为位置参数。您使用的是什么版本的python?这很重要。Python2.7不会抛出错误。这是一个有趣的问题,我想知道为什么有人会在实践中以如此间接的方式使用它。@rdodev你完全正确。这只是一个示例,旨在展示Python函数调用可以走多远。这是为了教育目的。但是点击这个问题意味着我错过了一些东西(或者有一个bug)。@user3022222酷。我只是希望你不会在发布软件的时候带着疯狂的争论:)再一次,我觉得这很有趣,但天哪,我希望人们不要用它来以如此复杂的方式传递争论。我想知道PEP8是否对传递参数的方法有什么看法。@JBernardo您的回答对我来说很有意义,但这不是我在阅读Python文档时得到的。我知道在函数调用期间,参数按以下顺序处理:位置、命名、*Targ、**Darg。您说(并显示)它们是按以下顺序处理的:positional、*Targ、named、**Darg。你手头有描述这种行为的python文档或PEP吗?@user3022222没有,我说的是它们最终被放在一起了,因为
*args
也是位置参数。@JBernardo我相信我已经开始了解到底发生了什么。如果我错了,请纠正我。函数调用中的参数的顺序必须为:位置、命名、*Targs、**Dargs。但是位置参数(实位置参数和*TARG)首先传递给函数,然后传递所有命名参数(实命名参数和**DARG)。如果某个命名参数已经与位置参数一起传递,则会出现错误。@JBernardo在我看来,这是一个强烈反对混合位置参数和命名参数的理由,因为为了防止参数传递时发生冲突,您需要确切地知道函数头(因此不需要位置参数)。
>>> def func(*args, **kw):
print(args, kw)
>>> func(1, b = 3, *(2,), **{'d':4})
(1, 2) {'b': 3, 'd': 4}