【问题标题】:Convert a string to preexisting variable names将字符串转换为预先存在的变量名
【发布时间】:2008-11-17 07:32:09
【问题描述】:

如何将字符串转换为Python中的变量名?

例如,如果程序包含一个名为self.post 的对象,其中包含一个名为的变量,我想做如下操作:

somefunction("self.post.id") = |Value of self.post.id|

【问题讨论】:

    标签: python


    【解决方案1】:

    注意:在您从用户输入的输入中查找要查找的名称的任何情况下,都不要使用 eval。例如,如果这来自网页,则没有任何东西可以阻止任何人进入:

    __import__("os").system("Some nasty command like rm -rf /*")
    

    作为论据。更好的是使用getattr() 限制明确定义的查找位置,例如字典或实例。例如,要查找 self 的“post”值,请使用:

    varname = "post"
    value = getattr(self, varname)  # Gets self.post
    

    同样设置,使用setattr():

    value = setattr(self, varname, new_value)
    

    要处理fully qualified names,例如“post.id”,您可以使用以下函数代替getattr() / setattr()

    def getattr_qualified(obj, name):
        for attr in name.split("."):
            obj = getattr(obj, attr)
        return obj
    
    def setattr_qualified(obj, name, value):
        parts = name.split(".")
        for attr in parts[:-1]:
            obj = getattr(obj, attr)
        setattr(obj, parts[-1], value)
    

    【讨论】:

    • 如果没有'self'怎么办? IE。你在全球范围内。然后我猜 vars()['name'] 必须使用,或者是否有 getattr 后备?
    【解决方案2】:

    正如 Stack 溢出问题 Inplace substitution from ConfigParser 中提到的,您正在寻找 eval()

    print eval('self.post.id') # Prints the value of self.post.id
    

    【讨论】:

    • 为什么不使用 setattr() ?
    【解决方案3】:

    另外,Python 中有一个 globals() 函数,它返回一个包含所有已定义变量的字典。你也可以使用这样的东西:

    print globals()["myvar"]
    

    【讨论】:

      【解决方案4】:

      您可以按照 Geo 推荐的方式进行操作,或者采用:

      >>> wine = 'pinot_noir'
      >>> vars()[wine] = 'yum'
      >>> pinot_noir
      'yum'
      

      注意:vars()和globals()是一样的,我只是习惯用vars() 我很惊讶没有人在这件事上叫我出来!反正vars()locals()是一样的。

      【讨论】:

        【解决方案5】:

        使用这个

        var="variable name"
        def returnvar(strig):
            rtn="return "+string
            exec(rtn)
        

        var 将是您的字符串并运行 returnvar(var) 将返回变量

        【讨论】:

        • 您自己尝试过这个答案吗? returnvar 有什么是eval 没有做到的吗?
        猜你喜欢
        • 2021-08-05
        • 2011-08-27
        • 2010-12-04
        • 2015-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多