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

Python:如何获取函数调用中当前求值参数的对应名称

让get_arg_val知晓对应do_sum参数名的解决方法

方法一:直接传入参数标识(最简洁可靠)

修改get_arg_val函数,让它接收一个参数名参数,调用时明确指定对应的参数名即可:

def do_sum(a, b, c):
    return a + b + c


def get_arg_val(param_name):
    print(f"call f,对应参数:{param_name}") # 直接打印传入的参数名
    return 1

x = do_sum(get_arg_val('a'), get_arg_val('b'), get_arg_val('c'))
print(x)

这种方式逻辑简单,没有额外依赖,完全可控,适合绝大多数场景。

方法二:利用inspect模块自动追踪(无需手动传参)

如果不想手动传入参数名,可以借助Python的inspect模块分析调用栈和函数签名,自动识别当前调用对应的参数名。注意Python中位置参数是从左到右依次求值的,我们可以通过记录调用次数来匹配参数顺序:

import inspect

def do_sum(a, b, c):
    return a + b + c


def get_arg_val():
    # 获取上一层调用栈帧(即do_sum的调用上下文)
    caller_frame = inspect.currentframe().f_back
    # 获取do_sum的函数签名
    func_sig = inspect.signature(do_sum)
    # 绑定调用时的参数
    bound_args = func_sig.bind(*caller_frame.f_locals['args'], **caller_frame.f_locals['kwargs'])
    bound_args.apply_defaults()

    # 记录当前是第几次调用,匹配位置参数顺序
    if not hasattr(get_arg_val, 'call_counter'):
        get_arg_val.call_counter = 0
    current_idx = get_arg_val.call_counter
    get_arg_val.call_counter += 1

    # 获取do_sum的位置参数列表,按顺序取对应名称
    pos_param_names = [p.name for p in func_sig.parameters.values() if p.kind == p.POSITIONAL_OR_KEYWORD]
    target_param = pos_param_names[current_idx]

    print(f"call f,对应参数:{target_param}")
    return 1

x = do_sum(get_arg_val(), get_arg_val(), get_arg_val())
print(x)
# 重置计数器,避免后续调用受影响
del get_arg_val.call_counter

方法二的局限性

  • 仅适用于单线程场景,多线程下需要加锁处理计数器;
  • 如果调用do_sum时混合使用位置参数和关键字参数,或者参数顺序调整,需要额外逻辑适配;
  • 依赖inspect模块,逻辑相对复杂,调试成本更高。

内容的提问来源于stack exchange,提问作者lowtech

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 05:35:13