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
相关产品推荐
相关产品推荐

