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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 01:52:35