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

如何向参数更少的函数传递含多余键的字典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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 21:30:51