有没有办法在运行时知道变量的名称(来自代码)?或编译时遗忘的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
.)
Ale*_*lli 10
变量名仍然存在于已编译的代码中(例如dir
内置函数可以如何工作),但是那里的映射从名称到值,而不是相反.因此,如果有几个变量都值得,例如,23
就没有办法仅根据值告诉彼此23
.
这里是一个基本(可能很奇怪)的函数,显示其参数的名称...这个想法是分析代码并搜索对该函数的调用(在 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)
如果您无法控制项目的格式,您仍然可以改进代码以检测和管理不同的情况......
总的来说,我猜静态代码分析可以产生更可靠的结果,但我现在懒得检查它