2009-05-31 56 views
26

有没有办法在运行时知道变量的名称(来自代码)? 或在编译过程中忘记var名称(字节码或不)?在运行时在python中检索一个变量的名字?

例如

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

注意:我说的是纯数据型变量(INT,STR,列表...)

+6

难道你必须输入变量名得到它的名字吗? – 2009-05-31 20:57:35

+2

是的,那是3年前的事了,我不记得为什么这个问题是有道理的。但是啊!它非常受欢迎,所以它有一些东西。 – 2013-01-21 16:28:44

+0

下面是一个用法示例:变量foo,bar,baz在那里,我想完全按照{'foo':foo,'bar':bar,'baz':baz}来获取字典。当然,我可以按照我刚刚做的那样打字,但不是非常简洁。在我看来,“本地人()”传递的信息太多,并不完美。我期望的是一个像`magic_func([foo,bar,baz])`这样的函数,它返回我想要的字典 – ZZY 2014-06-05 12:39:29

回答

2

这里一个基本的(也许怪异)功能,显示其参数的名称... 的想法是分析代码并搜索调用的函数(在初始化方法添加它可以帮助找到实例名,虽然与更复杂的代码分析)

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) 

如果你没有对你的项目的格式控制你仍然可以提高代码来检测和管理不同的情况......

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

10

变量名坚持在编译的代码(这是怎么例如dir内置CAN工作),但是那里的映射是从名称到价值的,而不是相反。因此,如果有几个变量都值得,例如23,则无法仅通过值23来告诉它们。

29

变量名不会被遗忘,你可以通过自省访问变量(并查看你有哪些变量),例如,

>>> i = 1 
>>> locals()["i"] 
1 

然而,因为在Python中没有指针,没有办法引用变量,而无需实际编写它的名字。所以如果你想打印一个变量名和它的值,你可以通过locals()或类似的函数。 ([i]成为[1],有没有办法恢复了1实际上是从i传来的信息。)

+0

这解决了我的情况。然后我对它们的值进行反向查找,并找到它们的名字。谢谢。 – 2009-05-31 21:11:32

+5

关于这一点的难点在于,如果你只有'我',那么它不可能在`locals()`中找到它的名字。考虑'我= 1; J = 1;”。在这之后'locals()[“i”]是locals()[“j”]'。如果你拥有的只是“我”,那么循环遍历locals()将导致找到“i”或“j”作为名称。 – 2009-06-01 02:10:42

+1

D.可能打算说“如果你拥有的只是`1` [”]“ – akaihola 2009-08-19 05:00:08

3

这将简单数据类型(STR,整型,浮点,列表等)

def my_print(var_str) : 
    print var_str+':', globals()[var_str] 
4

在这里工作是我用它来打印变量的值的函数,它适用于本地和全局:

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> 
2

你可以做到这一点,它只是不漂亮。

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} 
相关问题