兩種不完美的方式:
用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。實際中少用。
