Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 函数参数解包错误_Python_Argument Unpacking - Fatal编程技术网

Python 函数参数解包错误

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

看看这个示例(使用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 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}