如何在configobj值中转义%符号?

12 投票
5 回答
11273 浏览
提问于 2025-04-16 06:14

我想在一个configobj配置文件中同时使用解析时和运行时的字符串插值。最简单的字符串插值方法是用Python的"%(foo)s" % somedict。可惜的是,configobj也用这个插值方法,而我还没找到办法来避免这个问题。理想情况下,我的值应该是这样的:

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

但是configobj会尝试(但失败)去替换第二个变量。另一个解决这个问题的方法是提供一种不同的(configobj)方式来同时实现解析时和运行时的插值。

5 个回答

4

是的,不幸的是,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'
12

虽然这个问题发布后可能有了变化,但我发现可以使用'%'这个字符来进行转义。在我的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'

希望这对将来的某个人有帮助(:

1

答案的新版本:

你可以使用 "".format()(Python 2.6 及以上版本)或者 string.Template(Python 2.4 及以上版本)来进行运行时的字符串插入,这样就能避免冲突。

(旧版本是基于标准的 ConfigParser 模块,所以有那些评论。)

撰写回答