当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《将字符串转换为预先存在的变量名称》经验,为你挑选了4个好方法。

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

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

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

Brian.. 50

注意:千万不能在任何情况下,你所得到的名称来查找与用户输入的输入使用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)

要处理完全限定名称,例如"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.我绝对建议使用getattr()和setattr() (3认同)


Owen.. 39

正如在Stack Overflow问题中引用问题来自ConfigParser的Inplace替换,您正在寻找eval():

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

为什么不使用setattr()? (2认同)


Geo.. 15

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

print globals()["myvar"]


gibson.. 15

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

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

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



1> Brian..:

注意:千万不能在任何情况下,你所得到的名称来查找与用户输入的输入使用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)

要处理完全限定名称,例如"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.我绝对建议使用getattr()和setattr()

2> Owen..:

正如在Stack Overflow问题中引用问题来自ConfigParser的Inplace替换,您正在寻找eval():

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


为什么不使用setattr()?

3> Geo..:

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

print globals()["myvar"]



4> gibson..:

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

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

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

推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有