Python中如何获取传入函数的变量名而非变量值?
获取函数传入变量的名称(Python 3.12.3 Windows)
要在函数中获取传入变量的名称而非值,可以借助inspect模块获取调用上下文,再通过ast模块解析源代码提取变量名,以下是具体实现方案:
实现代码
import inspect import ast import pandas as pd def get_var_name(var): # 获取调用get_var_name的上层栈帧(即调用目标函数的代码所在帧) caller_frame = inspect.currentframe().f_back.f_back try: # 读取调用者的源代码 source_code = inspect.getsource(caller_frame) # 解析为抽象语法树 tree = ast.parse(source_code) # 遍历语法树,找到调用get_var_name的节点 for node in ast.walk(tree): if isinstance(node, ast.Call) and hasattr(node.func, 'id'): if node.func.id == get_var_name.__name__: # 提取第一个参数的字符串表示 arg_node = node.args[0] return ast.dump(arg_node).strip('"') except (TypeError, OSError): # 处理无法获取源码的情况(如交互式环境、压缩包代码) return "unknown_var" return "unknown_var" def df_check(df): var_name = get_var_name(df) assert not df.empty, f"DataFrame {var_name} 为空!" # 测试示例 if __name__ == "__main__": df_no = pd.DataFrame() try: df_check(df_no) except AssertionError as e: print(e) # 输出:DataFrame df_no 为空!
关键说明
inspect.currentframe()获取当前栈帧,通过f_back两层跳转拿到调用df_check的代码所在栈帧,确保能读取到正确的调用上下文源码。ast模块用于解析源代码的抽象语法树,精准定位传入的变量名,避免简单字符串匹配带来的错误。- 异常处理覆盖了无法获取源码的场景(比如在Python交互环境中运行,
inspect.getsource会抛出OSError),此时返回默认名称unknown_var。
局限性
- 如果传入的不是直接变量(比如
df_check(df1.filter(like='col'))这类表达式),会返回表达式的字符串而非变量名。 - 仅适用于脚本文件中的代码,在交互式环境或动态生成的代码中可能无法正常工作。
内容的提问来源于stack exchange,提问作者blue and grey
相关产品推荐
相关产品推荐

