【发布时间】:2008-11-17 07:32:09
【问题描述】:
如何将字符串转换为Python中的变量名?
例如,如果程序包含一个名为self.post 的对象,其中包含一个名为的变量,我想做如下操作:
somefunction("self.post.id") = |Value of self.post.id|
【问题讨论】:
标签: python
如何将字符串转换为Python中的变量名?
例如,如果程序包含一个名为self.post 的对象,其中包含一个名为的变量,我想做如下操作:
somefunction("self.post.id") = |Value of self.post.id|
【问题讨论】:
标签: python
注意:在您从用户输入的输入中查找要查找的名称的任何情况下,都不要使用 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)
【讨论】:
正如 Stack 溢出问题 Inplace substitution from ConfigParser 中提到的,您正在寻找 eval():
print eval('self.post.id') # Prints the value of self.post.id
【讨论】:
您可以按照 Geo 推荐的方式进行操作,或者采用:
>>> wine = 'pinot_noir'
>>> vars()[wine] = 'yum'
>>> pinot_noir
'yum'
注意:vars()和globals()是一样的,我只是习惯用vars()
我很惊讶没有人在这件事上叫我出来!反正vars()和locals()是一样的。
【讨论】:
使用这个
var="variable name"
def returnvar(strig):
rtn="return "+string
exec(rtn)
var 将是您的字符串并运行 returnvar(var) 将返回变量
【讨论】:
returnvar 有什么是eval 没有做到的吗?