如何在运行时获取变量名?

35 投票
9 回答
27947 浏览
提问于 2025-04-15 11:57

有没有办法在程序运行时知道一个变量的名字(来自代码)?或者说,变量的名字在编译时就被遗忘了吗(无论是字节码还是其他)?

例如:

>>>  vari = 15
>>>  print vari.~~name~~()
'vari'

注意:我说的是普通的数据类型变量(比如 intstrlist 等等)。

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)

如果你无法控制项目的格式,你仍然可以改进代码,以检测和处理不同的情况……

总体来说,我觉得静态代码分析可以产生更可靠的结果,但我现在太懒了,不想去检查

撰写回答