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

如何在Python函数/类内部获取传入变量的名称并转为字符串

实现逻辑

可以通过Python内置的inspect模块获取调用栈的上下文信息,解析传入参数的原始变量名。


基础示例修改方案

你给出的第一个简单函数可以修改为如下形式,运行后直接输出'var_passed':

import inspect

var_passed = [1,2,3]
def fun(data_):
    # 获取外层调用栈的代码上下文
    call_frame = inspect.currentframe().f_back
    call_code = inspect.getframeinfo(call_frame).code_context[0].strip()
    # 解析括号内的参数名
    var_name = call_code[call_code.find('(')+1 : call_code.rfind(')')].strip()
    print(repr(var_name))

fun(var_passed)

实际场景适配(pandastable代码修改)

我们可以把变量名提取逻辑封装为通用函数,传入类中赋值给some_name即可,完整修改后的代码如下:

import tkinter as Tk
from pandastable import Table
from demo import demo_data
import pandas as pd
import inspect

def get_input_var_name(arg_index=0):
    """获取调用函数时第arg_index位参数的原始变量名"""
    # 向上取两层调用栈:当前工具函数 -> 业务函数 -> 原始调用位置
    call_frame = inspect.currentframe().f_back.f_back
    call_code = inspect.getframeinfo(call_frame).code_context[0].strip()
    args_part = call_code[call_code.find('(')+1 : call_code.rfind(')')]
    all_args = [item.strip() for item in args_part.split(',')]
    return all_args[arg_index]


class Result_pandastable(Tk.Frame):
    """Frame for panda dataframe with the pandastable module"""

    def __init__(self, parent=None, dataframe_: pd.DataFrame = None, df_name:str = None):
        self.parent = parent
        Tk.Frame.__init__(self)
        # 使用提取到的变量名赋值
        some_name = df_name if df_name else 'name'
        self.main = self.master
        self.main.geometry('800x800+200+100')
        self.main.title('Results_'+ some_name)
        self.tk_frame = Tk.Frame(self.main)
        self.tk_frame.pack(fill=Tk.BOTH, expand=1)

        self.df_steps = pd.DataFrame(data=dataframe_)

    def draw_table(self):
        self.table = pt = Table(self.tk_frame, dataframe=self.df_steps, showtoolbar=True, showstatusbar=True, showindex= True)
        pt.show()
        self.pack(fill=Tk.BOTH, expand=1)
        self.mainloop()

def draw_table(dataframe_):
    # 提取传入的dataframe原始变量名
    df_var_name = get_input_var_name()
    Result_pandastable(dataframe_= dataframe_, df_name=df_var_name).draw_table()

if __name__ == '__main__':
    draw_table(demo_data)

注意事项

  • 该方案仅适用于直接传入变量名的场景,如果传入的是表达式(比如draw_table(demo_data.copy())、draw_table(pd.DataFrame([1,2,3]))),会拿到完整的表达式字符串,不是纯变量名。
  • 如果需要兼容所有调用场景,更稳妥的方案是主动额外传变量名字符串作为参数,比如draw_table(demo_data, 'demo_data'),可靠性更高,不受调用格式影响。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 16:06:07