在运行时在python中检索一个variables的名字?
有没有办法知道,在运行时,variables的名称(从代码)? 或在编译过程中忘记var名字(字节码或不)?
例如
>>> vari = 15 >>> print vari。~~ name ~~() 'VARI'
注意:我在谈论普通的数据typesvariables(int,str,list …)
这里有一个基本的(也许是奇怪的)函数,它显示了它的参数名…这个想法是分析代码并search对函数的调用(在init方法中添加它可以帮助查找实例名称,尽pipe使用更复杂的代码分析)
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)
如果你不能控制你的项目的格式,你仍然可以改进代码来检测和pipe理不同的情况。
总的来说,我猜静态代码分析可以产生更可靠的结果,但我懒得现在检查它
variables名不会被遗忘,你可以通过自省来访问variables(并查看你拥有的variables),例如
>>> i = 1 >>> locals()["i"] 1
但是,由于Python中没有指针,因此如果不实际编写名称,就无法引用variables。 所以如果你想打印一个variables名和它的值,你可以通过locals()
或类似的函数。 ( [i]
变成[1]
并且没有办法检索1
实际上来自i
。
variables名保存在编译后的代码中(例如dir
内置函数可以工作),但是映射是从名称到值,而不是相反。 所以,如果有几个variables都是值得的,比如23
,那么只有23
的值才能告诉它们。
这里是我用来打印variables值的函数,它适用于本地以及全局variables:
import sys def print_var(var_name): calling_frame = sys._getframe().f_back var_val = calling_frame.f_locals.get(var_name, calling_frame.f_globals.get(var_name, None)) print (var_name+':', str(var_val))
所以下面的代码:
global_var = 123 def some_func(): local_var = 456 print_var("global_var") print_var("local_var") print_var("some_func") some_func()
生产:
global_var: 123 local_var: 456 some_func: <function some_func at 0x10065b488>
这将适用于简单的数据types(str,int,float,list等)
def my_print(var_str) : print var_str+':', globals()[var_str]
你可以做到这一点,只是不漂亮。
import inspect, sys def addVarToDict(d, variable): lineNumber = inspect.currentframe().f_back.f_lineno with open(sys.argv[0]) as f: lines = f.read().split("\n") line = lines[lineNumber-1] varName = line.split("addVarToDict")[1].split("(")[1].split(",")[1].split(")")[0].strip() d[varName] = variable d = {} a=1 print d # {} addVarToDict(d,a) print d # {'a': 1}
我尝试从上面的post以下链接没有成功:谷歌search返回这一个。
就在昨天,我看到一个工作代码的博客文章,只是这样做。 这是链接:
http://pyside.blogspot.com/2009/05/finding-objects-names.html