• python如何获取变量的变量名


    假设现在存在一个值为1变量名为a的变量,如何通过一个函数获取该变量的变量名a?

    上面这个需求来源于某群友的一个要求,希望能有一个这样的函数来方便打印。

    这个需求很扯淡啊,为什么不用格式化输出?它回复到‘懒’,好吧,懒确实是程序员技术进步的第一推动力。

    从变量名获取变量值

    当时第一个想法,从变量获取变量名是相当麻烦的事情,老哥你就用用变量名吧。

    def print_var(x:str)->None:
        print(s,"=",eval(s))
    

    粗暴简单的eval,完美解决你的困难。

    内心小剧场:安全不安全管我何事

    使用locals

    毫无疑问,这样的方法遭受到群里老哥的拒绝,要多打两个引号,老哥,你也太懒了吧。

    虽然python作为一门动态语言,是肯定有反射这个功能的,但是想从变量获取变量名还是很麻烦的。

    def get_variable_name(x)->str:
        for k,v in locals().items():
            if v is x:
                return k
    def print_var(x)->None:
        print(get_variable_name(x),'=',x)
    

    当然上述代码还是有一些小bug的,比如下面的代码,但是无伤大雅,

    a = 1
    b = 1
    print_var(a)
    print_var(b)
    

    带着一些小小的得意,另一个群友发来了这样一张回答

    气氛瞬间凝固了

    另一种通过变量名获取变量值的方法

    来源于别人提供的知乎回答

    import sys
    
    def append(list_, name):
        list_.append((name, sys._getframe().f_back.f_locals[name]))
    
    >>> mylist = []
    >>> myvar = 12
    >>> append(mylist, 'myvar')
    >>> mylist
    [('myvar', 12)]
    

    回答可以作为参考,其中还提供了inspect+re来获取的方法,在这就不赘述了,以免教坏别人。

  • 相关阅读:
    day30 python类的继承,抽象类等
    20170702-变量说明,静态方法,类方法区别,断点调试,fork,yield协程,进程,动态添加属性等。。
    day29 面向对象入门
    day28 import,from * import *,__name__
    day27 模块:正则re, configparser, subprocess
    day26 re正则表达式
    MD5的学习与练习
    HBase
    Struts13---Ognl
    Struts12---文件的下载
  • 原文地址:https://www.cnblogs.com/lynsyklate/p/8069283.html
Copyright © 2020-2023  润新知