Python中如何在调用函数前检查其所需参数?
问题
假设定义了以下两个函数:
def func_1(a, b): return a + b def func_2(a, b, c): return a + b + c
当从用户处获取三个整数a、b、c后,想要实现如下逻辑:
if <func_1 accepts a, b, and c>: print(func_1(a, b, c)) else: print(func_2(a, b, c))
已知*args、**kwargs和try/except的用法,也了解其他规避手段,但实际场景是使用huggingface evaluate包时遇到问题:向多个指标函数传递**kwargs时,部分函数会抛出意外关键字错误,而其他函数需要这些参数或不关心。由于指标数量过多,逐个编写except语句不现实,且生成回溯的开销较大。尝试过functools.partial但它不会在调用前评估函数,希望找到一种无需try/except、可循环按需添加参数的可行方法。
解决方法
可以利用Python的inspect模块分析函数的参数签名,提前筛选出目标函数可接受的参数,避免传递无效参数引发错误,具体实现如下:
核心思路
- 获取目标函数的参数签名,明确它能接受的参数名称和数量
- 从待传递的参数集合中筛选出函数支持的参数
- 用筛选后的参数调用函数
示例代码
处理关键字参数的场景
import inspect def func_1(a, b): return a + b def func_2(a, b, c): return a + b + c def safe_call(func, **kwargs): # 获取函数的参数签名 sig = inspect.signature(func) # 筛选出函数参数列表中存在的关键字参数 valid_params = {k: v for k, v in kwargs.items() if k in sig.parameters} # 调用函数并返回结果 return func(**valid_params) # 测试调用 a, b, c = 1, 2, 3 print(safe_call(func_1, a=a, b=b, c=c)) # 输出:3 print(safe_call(func_2, a=a, b=b, c=c)) # 输出:6
兼容位置参数的场景
如果需要同时处理位置参数,可以扩展函数,利用signature.bind方法提前验证参数匹配性:
def safe_call_full(func, *args, **kwargs): sig = inspect.signature(func) try: # 绑定参数并自动填充默认值 bound_args = sig.bind(*args, **kwargs) bound_args.apply_defaults() return func(*bound_args.args, **bound_args.kwargs) except TypeError: # 仅捕获参数绑定阶段的错误,开销远小于函数执行时的异常 # 可根据需求返回默认值或做其他处理 return None
优势说明
- 无需为每个指标函数编写单独的异常处理逻辑,可批量循环处理
- 通过提前分析参数签名避免无效参数传递,从根源上减少异常触发
- 即使使用
sig.bind的异常捕获,也仅在参数绑定阶段,不会生成函数执行时的完整回溯,开销极低
内容的提问来源于stack exchange,提问作者m.m
相关产品推荐
相关产品推荐

