我已经读了如何获得一个函数名作为字符串?。
如何对变量做同样的事情呢?与函数相反,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]
>> my_var = 5
>> my_var_name = [ k for k,v in locals().items() if v == my_var][0]
>> my_var_name
'my_var'
如果myvar指向另一个变量,如果你得到一个错误,试试这个(由@mherzog建议)-
>> my_var = 5
>> my_var_name = [ k for k,v in locals().items() if v is my_var][0]
>> my_var_name
'my_var'
locals() -返回包含当前作用域局部变量的字典。
通过遍历这个字典,我们可以检查值等于定义变量的键,只需提取键就可以得到字符串格式的变量文本。
From(稍作改动后)
https://www.tutorialspoint.com/How-to-get-a-variable-name-as-a-string-in-Python
我有一个方法,虽然不是最有效的…它的工作原理!(它不涉及任何花哨的模块)。
基本上,它将你的变量ID与globals()变量ID进行比较,然后返回匹配的名称。
def getVariableName(variable, globalVariables=globals().copy()):
""" Get Variable Name as String by comparing its ID to globals() Variables' IDs
args:
variable(var): Variable to find name for (Obviously this variable has to exist)
kwargs:
globalVariables(dict): Copy of the globals() dict (Adding to Kwargs allows this function to work properly when imported from another .py)
"""
for globalVariable in globalVariables:
if id(variable) == id(globalVariables[globalVariable]): # If our Variable's ID matches this Global Variable's ID...
return globalVariable # Return its name from the Globals() dict
在Python中,def和class关键字将特定的名称绑定到它们定义的对象(函数或类)。类似地,模块通过在文件系统中调用某个特定的名称来命名。在这三种情况下,都有一种明显的方法可以将“规范”名称分配给有问题的对象。
然而,对于其他类型的对象,这样的规范名称可能根本不存在。例如,考虑列表中的元素。列表中的元素不是单独命名的,在程序中引用它们的唯一方法完全可能是在包含它们的列表上使用列表索引。如果将这样一个对象列表传递到函数中,则不可能为值分配有意义的标识符。
Python不会将赋值对象左边的名称保存到赋值对象中,因为:
这需要在多个冲突的对象中找出哪个名称是“规范的”,
对于那些从未赋值给显式变量名的对象来说,这是没有意义的,
这样效率会非常低,
实际上没有其他现存的语言能做到这一点。
例如,使用lambda定义的函数将始终具有"name" <lambda>,而不是特定的函数名。
最好的方法是简单地要求调用者传入一个(可选的)名称列表。如果输入“…”,“…”'太麻烦了,你可以接受一个包含逗号分隔的名字列表的字符串(像namedtuple那样)。