程序运行时,其实变量名本身并不重要,更重要的是变量的类型和值
但我们花了很多心思为了考虑可读性而命名的(一长串)变量名,为何不能简单一点取出来呢?
这是一个比较小众的需求,但比较有意思,在网上找了一些方法,都比较零散,本文汇总一下
应用场景可能不多,主要在画图命名子图,或者为pd.DataFrame设置index或column时可能用到
# 先定义测试用的变量,分别是字符串、整型、浮点型、np.array、pd.DataFrame aa='weqweqw' bb=4565 cc=546.5 dd=np.array([bb,cc]) ff=pd.DataFrame([dd,dd[::-1]]) # 放到列表里,方便后续在循环中使用 test=[aa,bb,cc,dd,ff]
方法一,需要调用inspect库,有时候会有奇怪的bug,如果一个程序中定义了很多变量,不一定var_name_list的第0个元素就是变量名本身
# 方法一,需要调用inspect库,有时候会有奇怪的bug,如果一个程序中定义了很多变量,不一定var_name_list的第0个元素就是变量名本身 def retrieve_name(var): import inspect callers_local_vars = inspect.currentframe().f_back.f_locals.items() var_name_list = [var_name for var_name, var_val in callers_local_vars if var_val is var] if len(var_name_list) > 0: return var_name_list[0] # 测试方法一 print('方法一') for i in test: i_name=retrieve_name(i) print(i_name,type(i_name),sep='\n')
方法二,变量多时非常容易出bug,且每次使用前都要重新取vk,使用麻烦,本人不推荐
# 方法二,变量多时容易出bug,且每次使用前都要重新取vk,使用麻烦,本人不推荐 vk = {} p_locals = locals().copy() for k,v in p_locals.items(): vk[ id(v) ] = k def var_name(p,vk): return vk[ id(p) ] # 测试方法二 print('方法二') for i in test: i_name=var_name(i,vk) print(i_name,type(i_name),sep='\n')
方法三,代码短小,只能现场使用,不能封装函数,也不能写进循环,简单使用可以,大量使用的话略麻烦,花这个工夫不如自己输入了
# 方法三,代码短小,但只能现场使用,不能封装函数,也不能写进循环,大量使用的话略麻烦 aa_name=list(dict(aa=aa).keys())[0] bb_name=list(dict(bb=bb).keys())[0] cc_name=list(dict(cc=cc).keys())[0] dd_name=list(dict(dd=dd).keys())[0] ff_name=list(dict(ff=ff).keys())[0] # 测试方法三 print('方法三', aa_name,type(aa_name), bb_name,type(bb_name), cc_name,type(cc_name), dd_name,type(dd_name), ff_name,type(ff_name), sep='\n')
方法四,先一行匿名函数声明,后面一行代码调用,不容易出bug,个人推荐使用!
# 方法四,匿名函数,先一行代码声明,后面一行代码调用,不容易出bug,推荐使用 vname = lambda v,nms: [ vn for vn in nms if id(v)==id(nms[vn])][0] # 测试方法四 print('方法四') for i in test: i_name=vname(i,locals()) print(i_name,type(i_name),sep='\n')
简单的使用场景下,这几个方法都是没问题的
如果有更简便的方法欢迎交流
祝各位科研顺利~