如何在configobj值中转义%符号?
我想在一个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 模块,所以有那些评论。)