【趣】Python获取变量的变量名
两种不完美的方式:
用locals,globals
用locals获取变量列表,再遍历比较对象。
def namestr(obj): ns = globals() return [name for name in namespace if ns[name] is obj]
其中is比较的是id,但如果a=b,则两者id相同。
缺点:如果两个变量a = b,则会返回locals列表中前者。
用inspect模块
import inspect 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)
缺点
:
1. 实际是取源代码,如果是:map(lambda i:varname(i), li),最后取出的总是i。
2. 由于取上层frame,如果是C代码调的,未知;且作为一个模块,最好不要和上层有关系。
备注
这两种方式都有作用上的缺陷,在设计上也不工程ful。实际中少用。
【本文章出自博客园willaty,转载请注明作者出处,误差欢迎指出~】