我已经读了如何获得一个函数名作为字符串?。
如何对变量做同样的事情呢?与函数相反,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]
获取实例变量的名称是完全可能的,只要它是类的属性。
这是我从Brett Slatkin的《Effective Python》中得到的。希望它能帮助到一些人:
类必须实现get、set和set_name dunder方法,它们是“描述符协议”的一部分。
当我运行它时,这是有效的:
class FieldThatKnowsItsName():
def __init__(self):
self.name = None
self._value= None
self.owner = None
def __set_name__(self, owner, name):
self.name = name
self.owner = owner
self.owner.fields[self.name] = self
def __get__(self, instance, instance_type):
return self
def __set__(self, instance, value):
self = value
class SuperTable:
fields = {}
field_1=FieldThatKnowsItsName()
field_2=FieldThatKnowsItsName()
table = SuperTable()
print(table.field_1.name)
print(table.field_2.name)
然后,您可以根据需要添加方法或扩展数据类型。
作为奖励,set_name(self, owner, name) dunder也传递父实例,因此Field类实例可以向父实例注册自己。
这是我从Brett Slatkin的《Effective Python》中得到的。我花了一段时间才弄清楚如何实现。
我写了包巫术健壮地做这种魔法。你可以这样写:
from sorcery import dict_of
columns = dict_of(n_jobs, users, queues, priorities)
并将其传递给dataframe构造函数。它相当于:
columns = dict(n_jobs=n_jobs, users=users, queues=queues, priorities=priorities)
我认为在Python中很难做到这一点,因为一个简单的事实是,你永远不会不知道你正在使用的变量的名称。所以,在他的例子中,你可以这样做:
而不是:
list_of_dicts = [n_jobs, users, queues, priorities]
dict_of_dicts = {"n_jobs" : n_jobs, "users" : users, "queues" : queues, "priorities" : priorities}
>> 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