如何使用字符串格式化动态赋值变量

0 投票
1 回答
770 浏览
提问于 2025-04-17 21:55

在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)

撰写回答