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

如何实现仅允许指定关键字的kwargs字典生成并抛出TypeError?

更优的实现方案

针对你的需求,有几种比原代码更简洁、易维护的实现方式,同时满足「不支持的参数抛出TypeError」的要求:

方式一:仅关键字参数+自动校验(参数数量少的场景)

用*标记函数参数,强制调用者只能传关键字参数,Python会自动对不支持的参数抛出标准TypeError,同时减少字典构造的重复代码:

def my_function(*, a=None, b=None, c=None, d=None, e=None):
    dictionary = {k: v for k, v in locals().items()}
    # 后续业务逻辑...

注:如果函数后续会新增局部变量,建议直接显式构造字典,避免无关变量混入:

def my_function(*, a=None, b=None, c=None, d=None, e=None):
    dictionary = dict(a=a, b=b, c=c, d=d, e=e)
    # 后续业务逻辑...

方式二:统一参数集合+**kwargs(参数数量多/需频繁修改的场景)

把允许的参数放在集合里统一管理,用**kwargs接收参数后校验,新增/修改参数只需调整集合,无需修改函数签名和字典构造逻辑:

ALLOWED_PARAMS = {"a", "b", "c", "d", "e"}

def my_function(**kwargs):
    invalid_args = set(kwargs.keys()) - ALLOWED_PARAMS
    if invalid_args:
        raise TypeError(f"my_function() got unexpected keyword argument(s): {', '.join(invalid_args)}")
    # 构造包含所有允许参数的字典,未传入的参数默认值为None
    dictionary = {param: kwargs.get(param) for param in ALLOWED_PARAMS}
    # 后续业务逻辑...

这个实现的优势是维护性极强,而且抛出的异常格式和Python原生的TypeError完全一致,符合你的要求。

对比原代码的优势

原代码需要重复编写参数名两次,容易出现笔误(比如参数名和字典键不一致);上面的两种方式要么通过语法特性自动校验,要么通过统一管理减少重复代码,降低出错概率。

内容的提问来源于stack exchange,提问作者Someone

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 00:22:19