我使用ConfigParser在从配置文件数据来加载如下:如何从Python ConfigParser .items()中排除DEFAULT?
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()的默认值,但仍然有插值?谢谢!
我不能完全理解为什么这是默认的行为,更不用说为什么没有办法将其关闭。 – 2014-12-22 16:33:52