You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 06:17:05