b = {'a':1,'b':2}
def func (a,**kargs):
print(a)
print(kargs)
func(1,**b)
这是不对的,b的key中有'a',解包(unpack)后相当于 a = 1, b = 2,与第一个形参重名而重复赋值。
正确的方法如下,密切关注函数定义的 /
b = {'a':1,'b':2}
def func (a,/,**kargs):
print(a)
print(kargs)
func(1, **b)
1
{'a': 1, 'b': 2}
因为在参数a的后面加入/,这是让形参a只接受位置参数而不接受解包后产生的 a = 1 关键字参数,从而不会重复赋值。同样的还有 * ,在*后的参数相反,只接受关键字参数,如如下定义
def func (pos_only, /, standard, *, kwd_only):
print(pos_only, standard, kwd_only)
顺便的,对**kargs直接传入键值对是正确的,如
def func (c , **kargs):
pass
func(1, a = 1 , b = 1)
也可以传入解包后的字典实参
func(1, **{'a':1,