将字符串转换为预先存在的变量名称

时间:2008-11-17 07:32:10

标签: python

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

例如,如果程序包含一个名为self.post的对象,其中包含一个名为的变量,我想做类似的事情:

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

4 个答案:

答案 0 :(得分:48)

注意:在您从用户输入的输入中获取名称的任何情况下,都要使用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)

答案 1 :(得分:39)

正如Stack Overflow问题 Inplace substitution from ConfigParser 所述,您正在寻找eval()

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

答案 2 :(得分:15)

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

print globals()["myvar"]

答案 3 :(得分:15)

你可以做一些像Geo推荐的那样的事情,或者选择:

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

注意:vars()和globals()是相同的,我只习惯使用vars() 我很惊讶没有人叫我这个!无论如何,它是vars() locals() 是相同的。