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

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模块分析函数的参数签名,提前筛选出目标函数可接受的参数,避免传递无效参数引发错误,具体实现如下:

核心思路

  1. 获取目标函数的参数签名,明确它能接受的参数名称和数量
  2. 从待传递的参数集合中筛选出函数支持的参数
  3. 用筛选后的参数调用函数

示例代码

处理关键字参数的场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 14:15:47