【问题标题】:How to use string formatting to dynamically assign variables如何使用字符串格式动态分配变量
【发布时间】:2014-04-16 10:51:36
【问题描述】:

在 Python 中,我正在填充一个对象来对本地机器上与 rsyslog 相关的配置、环境和其他方面(RHEL 6.4 Python 2.6.4)进行建模配置文件中定义的属性(attribute)。

我用这些值填充对象。

给定以下变量:

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

【问题讨论】:

    标签: python string variables attributes format


    【解决方案1】:

    您可以使用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)
    

    【讨论】:

    • Martijn,那么我们如何填充更深层的对象呢?如果我需要编辑我的原始问题,我会的。简而言之,我正在循环创建 rsyslog.,并在该循环中循环创建 rsyslog..s。您的 setattr 似乎将对象的属性设置回您刚刚阅读的任何内容,但我将设置唯一值。是否可以像这样使用 setattr?:setattr(rsyslog, instance5.startupscript, "/etc/init.d/sample")?通过扩展那么我们如何动态替换“instance5.startupscript”?
    • @JustinHaynes:使用通用方法进行了更新,以允许任意深度的属性链。
    • @JustinHaynes:原来的方法仍然可以正常工作,但您一定在循环中的某个地方设置了一些变量。
    猜你喜欢
    • 1970-01-01
    • 2018-06-07
    • 1970-01-01
    • 2015-11-06
    • 1970-01-01
    • 2019-12-05
    • 2023-01-08
    • 2021-11-25
    相关资源
    最近更新 更多