如何用字典调用函数并忽略意外关键字参数(不修改原函数)
问题场景
def some_function(a, b): return a + b some_magical_workaround({"a": 1, "b": 2, "c": 3}) # 返回3
无法为some_function添加**kwargs参数,需创建通用的包装函数some_magical_workaround实现上述调用,且该函数要能适配其他参数未知的函数。
解决方案
借助Python内置的inspect模块就能实现,核心逻辑是先获取目标函数的参数列表,再从传入的字典中筛选出匹配的参数调用函数。
通用适配版
如果要让包装函数能灵活适配任意函数,可以写成如下形式:
import inspect def some_magical_workaround(func, param_dict): # 获取目标函数的所有参数名 func_param_names = inspect.signature(func).parameters.keys() # 过滤出字典中与函数参数匹配的键值对 valid_params = {k: v for k, v in param_dict.items() if k in func_param_names} # 调用函数并返回结果 return func(**valid_params) # 测试原场景 def some_function(a, b): return a + b print(some_magical_workaround(some_function, {"a": 1, "b": 2, "c": 3})) # 输出3
适配其他函数示例
换个参数结构不同的函数也能正常运行:
def calculate_volume(length, width, height): return length * width * height print(some_magical_workaround(calculate_volume, {"length": 2, "width": 3, "height": 4, "extra": 10})) # 输出24
与示例调用格式完全匹配版
如果希望some_magical_workaround不用每次传入目标函数,可以用闭包绑定函数:
import inspect def wrap_target_func(func): def some_magical_workaround(param_dict): func_param_names = inspect.signature(func).parameters.keys() valid_params = {k: v for k, v in param_dict.items() if k in func_param_names} return func(**valid_params) return some_magical_workaround # 绑定目标函数 some_magical_workaround = wrap_target_func(some_function) # 调用方式与示例完全一致 print(some_magical_workaround({"a": 1, "b": 2, "c": 3})) # 输出3
内容的提问来源于stack exchange,提问作者caeus
相关产品推荐
相关产品推荐

