假設現在存在一個值為1變量名為a的變量,如何通過一個函數獲取該變量的變量名a?
上面這個需求來源於某群友的一個要求,希望能有一個這樣的函數來方便打印。
這個需求很扯淡啊,為什么不用格式化輸出?它回復到‘懶’,好吧,懶確實是程序員技術進步的第一推動力。
從變量名獲取變量值
當時第一個想法,從變量獲取變量名是相當麻煩的事情,老哥你就用用變量名吧。
def print_var(x:str)->None:
print(s,"=",eval(s))
粗暴簡單的eval,完美解決你的困難。
內心小劇場:安全不安全管我何事
使用locals
毫無疑問,這樣的方法遭受到群里老哥的拒絕,要多打兩個引號,老哥,你也太懶了吧。
雖然python作為一門動態語言,是肯定有反射這個功能的,但是想從變量獲取變量名還是很麻煩的。
def get_variable_name(x)->str:
for k,v in locals().items():
if v is x:
return k
def print_var(x)->None:
print(get_variable_name(x),'=',x)
當然上述代碼還是有一些小bug的,比如下面的代碼,但是無傷大雅,
a = 1
b = 1
print_var(a)
print_var(b)
帶着一些小小的得意,另一個群友發來了這樣一張回答
氣氛瞬間凝固了
另一種通過變量名獲取變量值的方法
來源於別人提供的知乎回答
import sys
def append(list_, name):
list_.append((name, sys._getframe().f_back.f_locals[name]))
>>> mylist = []
>>> myvar = 12
>>> append(mylist, 'myvar')
>>> mylist
[('myvar', 12)]
原回答可以作為參考,其中還提供了inspect+re來獲取的方法,在這就不贅述了,以免教壞別人。