【问题标题】:How to escape a % sign in a configobj value?如何在 configobj 值中转义 % 符号?
【发布时间】:2011-05-01 22:18:08
【问题描述】:

我想对configobj 配置文件的值同时使用解析时间和运行时插值。在 Python 中进行简单字符串插值的最简单方法是 "%(foo)s" % somedict。不幸的是 configobj 使用相同的插值机制,我还没有找到逃避它的方法。理想情况下,我的价值如下:

othervar = foo
someconfigobjkey = %(othervar)s %%(runtimevar)s

但是 configobj 尝试(但失败)替换第二个变量。回答这个问题的另一种方法是提供一种不同的 (configobj) 方法来执行解析时间和运行时插值。

【问题讨论】:

    标签: python escaping interpolation


    【解决方案1】:

    新版答案:

    您可以使用 "".format()(Python 2.6 或更高版本)或 string.Template(Python 2.4 或更高版本)进行运行时插值——这两者都可以消除冲突。

    (旧版本假定使用标准 ConfigParser 模块,因此使用了 cmets。)

    【讨论】:

    • 正如我在最初的问题中所说,我使用的是 configobj 而不是 ConfigParser。也许我认为这个模块太为人所知了,它可以在voidspace.org.uk/python/configobj.html找到。
    • 对不起,我不知道那个模块,也没有在你的帖子中将其识别为模块名称。有什么理由不只使用标准的 ConfigParser 模块?如果这对您也有用,那么问题也将得到解决:)
    • 在企业开发中,工具的选择并不总是给定的。
    • 也许您可以使用 string.Template 或 "".format() 代替 % 替换 tuntime 插值——这样可以消除冲突。
    • 您的上一个提案构成了一个全新的答案,与interpolation="template" 一样有效。
    【解决方案2】:

    是的,不幸的是 configobj 不遵循正常的标准 Python 格式规则,所以 %% 失败了,否则这将是转义百分号的正确方法。对我来说似乎有点设计缺陷。

    我能想到的在 configobj 值中包含文字 %(foo)s 序列的唯一方法是确保该序列的一部分本身是由替换生成的:

    >>> import configobj
    >>> c= configobject.ConfigObj()
    >>> c['foo']= 'bar'
    >>> c['pc']= '%'
    >>> c['v']= '%(foo)s %(pc)s(foo)s'
    >>> c['v']
    'bar %(foo)s'
    

    【讨论】:

      【解决方案3】:

      深入研究文档后,我发现了一个比 bobince 提出的解决方案更合适的解决方案:使用不同的插值引擎,例如 interpolation="template"。它有两个优点。

      1. 不干扰 % 符号。
      2. 支持转义。 ($$ 被插值到 $。)

      示例如下:

      othervar = foo
      someconfigobjkey = $othervar %(runtimevar)s
      

      【讨论】:

      • 这就是使用的方法!请注意,cfg = configobj.ConfigObj(…, interpolation='template') 似乎对验证没有影响,以后的cfg.validate(…) 仍然会失败。有效的方法是通过设置configobj.DEFAULT_INTERPOLATION = 'template' 来更改默认插值器。这适用于 Python 2 和 Python 3。
      【解决方案4】:

      尝试使用 '%'+'(foo)s'。在处理 ConfigParser 时,这对我有用。

      【讨论】:

        【解决方案5】:

        自发布此问题以来,情况可能已发生变化,但我发现您可以使用 '%' 字符进行转义。这在 Python 3 中对我有用。

        在我的 config.ini 文件中:

        [LOGGING]
        format = %%(asctime)-15s %%(message)s
        

        在我的python脚本文件中:

        import configparser
        
        # Load configuration
        config = configparser.ConfigParser()
        config.read("config.ini")
        
        log_config = config['LOGGING']
        
        print(log_config['format']) # prints out '%(asctime)-15s %(message)s'
        

        希望它对将来的某人有所帮助(:

        【讨论】:

          猜你喜欢
          • 2015-10-10
          • 2013-09-15
          • 2016-09-10
          • 2013-11-22
          • 2019-01-17
          • 1970-01-01
          • 1970-01-01
          • 2012-01-18
          • 1970-01-01
          相关资源
          最近更新 更多