我已经读了如何获得一个函数名作为字符串?。
如何对变量做同样的事情呢?与函数相反,Python变量没有__name__属性。
换句话说,如果我有一个变量,比如:
foo = dict()
foo['bar'] = 2
我正在寻找一个函数/属性,例如retrieve_name(),以便从这个列表中创建一个DataFrame in Pandas,其中列名由实际字典的名称给出:
# List of dictionaries for my DataFrame
list_of_dicts = [n_jobs, users, queues, priorities]
columns = [retrieve_name(d) for d in list_of_dicts]
即使变量值不指向名称,您也可以访问每个赋值变量及其值的列表,所以我很惊讶,只有一个人建议在那里循环查找您的var名称。
有人在回答中提到,你可能需要遍历堆栈并检查每个人的局部变量和全局变量来找到foo,但如果foo被赋值在你调用retrieve_name函数的作用域内,你可以使用inspect的当前帧来获取所有这些局部变量。
我的解释可能有点太啰嗦了(也许我应该用“foo”更少的单词),但下面是它在代码中的样子(注意,如果有多个变量赋给相同的值,你会得到两个变量名):
import inspect
x, y, z = 1, 2, 3
def retrieve_name(var):
callers_local_vars = inspect.currentframe().f_back.f_locals.items()
return [var_name for var_name, var_val in callers_local_vars if var_val is var]
print(retrieve_name(y))
如果你从另一个函数调用这个函数,就像这样:
def foo(bar):
return retrieve_name(bar)
foo(baz)
如果你想要baz而不是bar,你只需要再往后退一步。这可以通过在caller_local_vars初始化中添加额外的.f_back来实现。
请看一个例子:ideone