如何使用字符串格式化动态赋值变量
在Python中,我正在创建一个对象,用来模拟本地机器上与rsyslog相关的配置、环境和其他方面的信息(我使用的是RHEL 6.4和Python 2.6.4)。我会循环处理多个rsyslog守护进程的实例(这个实例的编号),以及在配置文件中定义的许多属性。
通过这些值,我来填充这个对象。
假设有以下变量:
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 个回答
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)