只列举两种方法
#打印变量名
import inspect
import sys
import re
import traceback
pattren = re.compile(r'[\W+\w+]*?get_name_1\((\w+)\)') # 注意和函数名一致
__get_variable_name__ = []
def get_name_1(x):
'''
第一种,复杂一些,需要声明两个全局变量,容易引发bug,但功能强一些
'''
global __get_variable_name__
if not __get_variable_name__:
__get_variable_name__ = pattren.findall(
traceback.extract_stack(limit=2)[0][3])
return __get_variable_name__.pop(0)
def get_name_2(var):
'''
第二种,简单,没那么好用,不容易引发其他bug
'''
callers_local_vars = inspect.currentframe().f_back.f_locals.items()
return [var_name for var_name, var_val in callers_local_vars if var_val is var]
if __name__ == "__main__":
a = 1
b = a
c = b
d = list(range(7))
print(get_name_1(a))
print(get_name_1(b))
print(get_name_1(c))
print([get_name_1(a), get_name_1(b), get_name_1(c)])
for i in d:
print(get_name_1(i), '=', i)
print(get_name_2(a))
print(get_name_2(b))
print(get_name_2(c))
print([get_name_2(a), get_name_2(b), get_name_2(c)])
for i in d:
print(get_name_2(i), '=', i)
运行结果: