代码之家  ›  专栏  ›  技术社区  ›  Berry Tsakala

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

  •  27
  • Berry Tsakala  · 技术社区  · 15 年前

    有没有一种方法可以在运行时(从代码中)知道变量的名称? 或者在编译过程中是否忘记了var名称(字节码)?

    例如

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

    注意:我说的是纯数据类型变量(int、str、list…)

    8 回复  |  直到 9 年前
        1
  •  2
  •   user110954    9 年前

    这里有一个基本的(可能很奇怪)函数,它显示了它的参数的名称… 其思想是分析代码并搜索对函数的调用(添加到 初始化 方法,它可以帮助查找实例名,尽管需要更复杂的代码分析)

    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)
    

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

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

        2
  •  29
  •   Michael Kuhn    15 年前

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

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

    但是,由于python中没有指针,所以在没有实际写入变量名的情况下,无法引用该变量。因此,如果要打印变量名及其值,可以通过 locals() 或者类似的功能。( [i] 变成 [1] 没有办法检索到 1 实际上来自 i )

        3
  •  10
  •   Alex Martelli    15 年前

    变量名在编译后的代码中保持不变(例如 dir 内置的可以工作),但是存在的映射从名称到值,而不是相反。例如,如果有几个变量都是值得的, 23 没有办法只根据值来区分它们。 二十三 .

        4
  •  4
  •   Periodic Maintenance    11 年前

    下面是一个我用来打印变量值的函数,它适用于局部和全局:

    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>
    
        5
  •  3
  •   bstpierre Edgar Aviles    13 年前

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

    def my_print(var_str) :
        print var_str+':', globals()[var_str]
    
        6
  •  2
  •   will    11 年前

    你能做到,只是不漂亮。

    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}
    
        7
  •  1
  •   Ben Blank    15 年前

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

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

        8
  •  0
  •   Benjamin Wohlwend    15 年前

    就在昨天,我看到了一篇博客文章,上面有一个工作代码。链接如下:

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