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

