【发布时间】:2011-01-12 10:56:17
【问题描述】:
我正在使用 ConfigParser 从配置文件中加载数据,如下所示:
test.conf:
[myfiles]
fileone: %(datadir)s/somefile.foo
filetwo: %(datadir)s/nudderfile.foo
load.py:
import ConfigParser
config = ConfigParser.ConfigParser({'datadir': '/tmp'})
config.read('test.conf')
print config.items('myfiles')
print config.get('myfiles', 'datadir')
输出:
$ python load.py
[('datadir', '/tmp'), ('filetwo', '/tmp/nudderfile.foo'), ('fileone', '/tmp/somefile.foo')]
/tmp
我很惊讶('datadir', '/tmp') 变量替换的默认值显示为 .items() 和 .get() 返回的一部分,就好像它们是配置文件中的值一样。这种行为是预期的吗?有什么变通方法,这样我就可以简单地迭代 .items() 而无需在其中获取默认字典值,但仍使用魔法插值?
参考:http://docs.python.org/library/configparser.html
谢谢!
更新: 有人指出这是预期的行为:默认值就像配置文件中的任何其他名称/值对一样。同样,配置文件中的名称/值对也可用于“魔术插值”,所以如果我定义:
foo: bar
zap: %(foo)snowl
我会收到[... ('zap': 'barnowl')]
这非常简洁,但我仍然想知道我是否可以完成我想要完成的任务:迭代我的配置文件中的名称/值对,使用变量插值,没有默认值。
我的具体情况是这样的:我想用{basedir: '/foo/bar'} 之类的东西初始化配置对象,因为某些文件的绝对路径因安装而异。然后我需要将该配置对象传递给并让各种其他类遍历文件。我不希望每个读取配置的类都必须知道它是用某些默认值初始化的,并且应该忽略它们,因为它们不是实际文件。这可能吗?有什么方法可以隐藏 .item() 和 .get() 的默认值但仍然有插值?谢谢!
【问题讨论】:
-
我无法理解为什么这是默认行为,更不用说为什么无法关闭它了。
标签: python configuration configparser defaults