如何向参数更少的函数传递含多余键的字典kwargs?
问题:如何用包含多余键的字典通过kwargs传递给参数更少的函数?
我想通过kwargs把同一个字典的元素传递给多个函数,但这个字典的键比部分函数的参数列表多。举个例子:
定义字典:
d = dict(a=1,b=2,c=3)
传给参数完全匹配的func1时可以正常运行:
def func1(a=3,b=2,c=5): return a+b+c x = func1(**d)
但传给参数更少的func2时会抛出TypeError:
def func2(a=1,b=1): return a+b x = func2(**d)
报错信息:
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) Cell In [4], line 4 1 def func2(a=1,b=1): 2 return a+b ----> 4 x = func2(**d) TypeError: func2() got an unexpected keyword argument 'c'
请问不调整函数参数的前提下,有没有简洁优雅的方法让这种场景正常运行?比如生成适配函数参数的字典子集?
解决方案
方法1:利用函数内置属性筛选参数
通过函数的__code__属性获取参数名,直接筛选字典中匹配的键:
def func2(a=1,b=1): return a+b # 仅保留func2接受的参数对应的键值对 filtered_d = {k: v for k, v in d.items() if k in func2.__code__.co_varnames[:func2.__code__.co_argcount]} x = func2(**filtered_d) print(x) # 输出3
注:co_argcount代表函数的位置参数总数(包含带默认值的参数),co_varnames会包含函数内部局部变量,取前co_argcount个就能得到函数的参数名列表。
方法2:用inspect模块更清晰地获取参数
inspect模块提供了更直观的参数获取方式,可读性更强:
import inspect def func2(a=1,b=1): return a+b # 获取func2的所有参数名 param_names = inspect.signature(func2).parameters.keys() filtered_d = {k: v for k, v in d.items() if k in param_names} x = func2(**filtered_d) print(x) # 输出3
方法3:封装通用工具函数复用
如果需要多次处理这类场景,可以封装成工具函数,避免重复代码:
import inspect def filter_kwargs(func, kwargs): """过滤出函数接受的kwargs""" param_names = inspect.signature(func).parameters.keys() return {k: v for k, v in kwargs.items() if k in param_names} # 使用示例 d = dict(a=1,b=2,c=3) def func2(a=1,b=1): return a+b x = func2(**filter_kwargs(func2, d)) print(x) # 输出3
内容的提问来源于stack exchange,提问作者Roee
相关产品推荐
相关产品推荐

