如何在运行时获取变量名?
有没有办法在程序运行时知道一个变量的名字(来自代码)?或者说,变量的名字在编译时就被遗忘了吗(无论是字节码还是其他)?
例如:
>>> vari = 15 >>> print vari.~~name~~() 'vari'
注意:我说的是普通的数据类型变量(比如 int
、str
、list
等等)。
9 个回答
12
变量名在编译后的代码中是会保留的(这就是为什么像 dir
这样的内置函数可以正常工作的原因),但是这里的映射关系是从名字到值,而不是反过来。所以,如果有几个变量的值都是 23
,那么仅仅根据值 23
是无法区分它们的。
35
变量名是不会被遗忘的,你可以通过查看来访问变量,看看你有哪些变量,比如:
>>> i = 1
>>> locals()["i"]
1
不过,因为Python没有指针,所以你不能不写变量名就引用它。如果你想打印一个变量的名字和它的值,你可以通过使用 locals()
或类似的函数来实现。(这里 [i]
会变成 [1]
,而且没有办法找回这个 1
实际上是来自于 i
的信息。)
3
这里有一个基本的(可能有点奇怪的)函数,它可以显示传入参数的名字……这个想法是分析代码,寻找对这个函数的调用(如果把它放在init方法里,可以帮助找到实例的名字,尽管这需要更复杂的代码分析)
def display(var):
import inspect, re
callingframe = inspect.currentframe().f_back
cntext = "".join(inspect.getframeinfo(callingframe, 5)[3]) #gets 5 lines
m = re.search("display\s+\(\s+(\w+)\s+\)", cntext, re.MULTILINE)
print m.group(1), type(var), var
请注意:从调用代码中获取多行信息是有帮助的,特别是在调用被拆分的情况下,就像下面的例子:
display(
my_var
)
但在这种情况下会产生意想不到的结果:
display(first_var)
display(second_var)
如果你无法控制项目的格式,你仍然可以改进代码,以检测和处理不同的情况……
总体来说,我觉得静态代码分析可以产生更可靠的结果,但我现在太懒了,不想去检查