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

时间:2009-05-31 20:44:08

标签: python

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

e.g:

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

注意:我说的是纯数据类型变量(intstrlist等。)

9 个答案:

答案 0 :(得分:31)

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

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

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

答案 1 :(得分:10)

变量名仍然存在于已编译的代码中(例如dir内置函数可以如何工作),但是那里的映射从名称到值,反之亦然。因此,如果有几个变量都值得,例如23,则无法仅根据值23将它们告诉彼此。

答案 2 :(得分: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>

答案 3 :(得分:3)

这适用于简单数据类型(str,int,float,list等)

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

答案 4 :(得分: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}

答案 5 :(得分:2)

这里有一个基本的(可能很奇怪的)函数,它显示了参数的名称...... 我的想法是分析代码并搜索对函数的调用(在 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)

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

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

答案 6 :(得分:1)

我在上面的帖子中尝试了以下链接但没有成功: 谷歌回复了这一个。

http://pythonic.pocoo.org/2009/5/30/finding-objects-names

答案 7 :(得分:0)

就在昨天,我看到一篇博文,其中包含了正常工作的代码。这是链接:

http://pyside.blogspot.com/2009/05/finding-objects-names.html

答案 8 :(得分:-1)

使用 f 字符串格式的不错的简单解决方案,这是 Python 3.6 及更高版本的本机:

vari

产生:

interval(1000)