繁体   English   中英

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

[英]Mixing *vargs and **kargs arguments in function call

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

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

有人可以说“因为实现如此说”,但是我也想知道为什么实现如此说。 为了实现此调用,实现不能将第一个转换为第二个吗?

像这样传递位置修饰符和关键字参数是该语言语法的一部分,而不是运行时功能。 也就是说, *(1,2,3)不会简单地创建一个特殊对象,该对象在调用时将传递给函数,并且“以某种方式”用于将值分配给已定义的参数。 这样,在排序中允许这种灵活性将以极大地使解析器复杂化为代价,而没有真正的好处。

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

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

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

关于您的问题,我认为第一行的问题是:

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

如果字典包含前三个参数之一,则可以为同一参数使用多个值。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM