如何使用字符串格式来动态分配变量

时间:2014-03-12 10:53:28

标签: python string variables attributes format

在Python中,我填充了一个对象,用于对本地计算机上的rsyslog相关的配置,环境和其他方面进行建模(RHEL 6.4 Python 2.6.4)我循环遍历rsyslog守护程序的许多实例(this_instance_number),以及许多配置文件中定义的属性(属性)。

使用这些值我填充对象。

给出以下变量:

this_instance_number=5
attribute="startupscript"

以下代码行,

print ('rsyslog.instance%(instance_number)s.%(attribute)s' %\
      {"instance_number": this_instance_number, "attribute": attribute})

将打印此文:

rsyslog.instance5.startupscript

如何根据该格式字符串分配文本引用的属性?

例如,如果硬编码,我会指定:

rsyslog.instance5.startupscript="/etc/init.d/sample"

但是,我想给它分配这样的东西:

('rsyslog.instance%(instance_number)s.%(attribute)s' %\
      {"instance_number": this_instance_number, "attribute": attribute}) = variable

1 个答案:

答案 0 :(得分:2)

您可以使用getattr()动态检索属性:

instance = getattr(rsyslog, 'instance{}'.format(this_instance_number))
print getattr(instance, attribute)
分配

setattr()

instance = getattr(rsyslog, 'instance{}'.format(this_instance_number))
setattr(instance, attribute, variable)

或者,对于任意深度的更通用的方法:

def get_deep_attr(obj, *path):
    return reduce(getattr, path, obj)

def set_deep_attr(obj, value, *path)
    setattr(get_deep_attr(obj, path[:-1]), path[-1], value)

print get_deep_attr(rsyslog, 'instance{}'.format(this_instance_number), attribute)
set_deep_attr(rsyslog, variable, 'instance{}'.format(this_instance_number), attribute)