python获取变量名的字符串

2023-05-16

有时候为了批量操作,我们会有获取变量名的需求。

而python本身是不能直接获取变量名的,例如如下的需求:

a = 1
print(a)  # 显示1

可以看到如果获取变量a,获取不到a这个字符串,而是获取到a的值。

那么如果需要对a这个变量名进行操作,怎么获取到呢?有以下几种办法:

以下版权归深度潜水:

一、获取单独一个变量名的三种办法(还有很多其它办法就不写了):

1、单变量转化之re

import re
def varname(p):
    for line in inspect.getframeinfo(inspect.currentframe().f_back)[3]:
        m = re.search(r'\bvarname\s*\(\s*([A-Za-z_][A-Za-z0-9_]*)\s*\)',line)
        if m:
            return m.group(1)
if __name__ == '__main__':
    a = 1
    print(varname(a))

2、单变量转化之inspect()

import inspect
# 这是从堆栈内存的第3层开始查找返回变量名称
def retrieve_name(var):
    for fi in inspect.stack()[2:]:
        for item in fi.frame.f_locals.items():
            if var is item[1]:
                return item[0]
    return ""

def outputVar(var):
    print("{} = {}".format(retrieve_name(var),var))
    print(type(retrieve_name(var)))
    print(retrieve_name(var))
    return retrieve_name(var)

a = 1
outputVar(a)

3、单变量转化之locals()或globals()

loc = locals()
def get_variable_name(variable):
    for k,v in loc.items():
        if loc[k] is variable:
            return k
a = 1
print(get_variable_name(a))

以上都可以获取单变量的字符串,进行exec转化既可以进行元编程操作了。

那怎么进行多个变量转化的批量操作呢?

二、放入for循环的多变量转化为字符串

# trans3代码将多变量的列表转化为字符串列表
def trans(vars_list):
    new_var_list = []
    var_dict = {}
    for var in vars_list:
        global_vars = globals()
        for k, v in global_vars.items():
            var_dict[id(v)] = k
        new_var_list.append(var_dict[id(var)])
    return new_var_list
  
a,b,c,d=10,11,12,13
trans([a,b,c,d])

for i in m:  # 可以用for循环操作,配合exec将每个变量进行操作,类似map。更复杂的操作待分析。
    exec(f"{i} += 1")

可以看到,通过以上代码就可以实现了,结果我就不放出来了,大家自己运行吧。注意一点,这个多变量转化可能会产生bug,最好是应用在使用不重复的堆内存的数据,比如列表对象、字典对象等内容上,这样就不会出错了。

参考:
https://www.zhihu.com/question/42768955

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python获取变量名的字符串 的相关文章

随机推荐