Python中使用*分隔定义多kwarg参数函数报错求助
问题分析与解决
报错原因
你误解了函数定义中*的用法:*, kwarg1, kwarg2里的*是用来分隔位置参数和强制关键字参数的,这里的kwarg1和kwarg2是需要显式传入的单个关键字参数名,并非用来接收批量键值对的可变关键字参数(那是**kwargs的作用)。
当你用**kwarg1调用函数时,Python会把字典kwarg1里的每个键值对展开成key=value的形式(比如a=1, b=2, c=3),加上**kwarg2展开的d=4, e=5, f=6,相当于给函数传入了6,7,a=1,b=2,c=3,d=4,e=5,f=6。但你的函数只接受arg1、arg2、kwarg1、kwarg2这四个参数,所以a、b这类参数名就成了函数不识别的意外参数,直接抛出TypeError。
修正第一种写法的方法
要让原函数正常运行,不需要展开字典,直接把字典作为值传给kwarg1和kwarg2这两个关键字参数即可:
def func(arg1, arg2, *, kwarg1, kwarg2): print(arg1, arg2) for k, v in kwarg1.items(): print(k, v) for k, v in kwarg2.items(): print(k, v) return None kwarg1 = {'a':1, 'b':2, 'c':3} kwarg2 = {'d':4, 'e':5, 'f':6} # 直接传入字典作为关键字参数的值,无需用**展开 func(6,7, kwarg1=kwarg1, kwarg2=kwarg2)
运行这段代码就能得到你期望的输出(注:Python 3.7+中字典遍历顺序为插入顺序,输出顺序会与你预期一致)。
补充说明
如果你的需求是接收任意数量的关键字参数,那你原来的替代写法(用**kwarg1)是合理的;但如果需要明确区分两组不同的字典参数,修正后的第一种写法更清晰,能明确约束函数的参数结构。
内容的提问来源于stack exchange,提问作者v_head
相关产品推荐
相关产品推荐

