在运行时在python中检索变量的名称?

Ber*_*ala 30 python

有没有办法在运行时知道变量的名称(来自代码)?或编译时遗忘的var名称(字节代码与否)?

例如

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

注意:我说的是普通的数据类型变量(int,str,list ...)

Mic*_*uhn 31

变量名称不会被遗忘,您可以通过内省访问变量(并查看您拥有的变量),例如

>>> i = 1
>>> locals()["i"]
1
Run Code Online (Sandbox Code Playgroud)

但是,因为Python中没有指针,所以没有实际写入名称就无法引用变量.因此,如果您想要打印变量名称及其值,您可以通过locals()或类似的功能.([i]变成[1]并且无法检索1实际来自的信息i.)

  • 关于这一点的困难之处在于,如果你只有'我'那么就不可能在`locals()`中找到它的名字.考虑'i = 1; J = 1;".在这之后'locals()["i"]是locals()["j"]'.如果您拥有的只是"我",那么循环遍历locals()将导致找到"i"或"j"作为名称. (5认同)
  • D. 可能打算说“如果你所拥有的只是`1` [...]” (2认同)

Ale*_*lli 10

变量名仍然存在于已编译的代码中(例如dir内置函数可以如何工作),但是那里的映射从名称到值,而不是相反.因此,如果有几个变量都值得,例如,23就没有办法仅根据值告诉彼此23.


use*_*954 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
Run Code Online (Sandbox Code Playgroud)

请注意:从调用代码中获取多行有助于防止调用被拆分,如下例所示:

display(
        my_var
       )
Run Code Online (Sandbox Code Playgroud)

但会产生意想不到的结果:

display(first_var)
display(second_var)
Run Code Online (Sandbox Code Playgroud)

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

总的来说,我猜静态代码分析可以产生更可靠的结果,但我现在懒得检查它