如何实现仅允许指定关键字的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
相关产品推荐
相关产品推荐

