在函数调用中混合* vargs和** kargs参数

时间:2014-09-03 13:58:44

标签: python python-3.x

def func(*v, **k): pass
func(**{'a': 1}, *(1, 2, 3))     # ERROR...
func(a=1, *(1, 2, 3))            # OK...

我不明白为什么第一个不起作用,而第二个不起作用。

有人可以说“因为实施说明了”,但我也想知道为什么实施这么说。无法实现将第一个转换为第二个以使此调用有效吗?

2 个答案:

答案 0 :(得分:1)

传递位置句和这样的关键字参数是语言语法的一部分,而不是运行时功能。也就是说,*(1,2,3)不会简单地创建一个在调用函数时传递给函数的特殊对象,并且"某种程度上"用于为定义的参数赋值。因此,在排序中允许这种灵活性的代价是使解析器大大复杂化而没有真正的好处。

答案 1 :(得分:1)

首先,仅当a参数是最后一个(第四个)时,第二行才有效。例如,以下代码将不起作用:

def func(a,b,c,d):
    pass

func(a=1, *(1, 2, 3))

对你提问,我认为第一行的问题是:

func(**{'a': 1}, *(1, 2, 3))

如果字典包含前3个参数之一,则可以通过这种方式为同一个参数设置多个值。

区别在于字典可以是变量,并且在不同的运行中具有不同的值,因此该代码始终被视为非法