我正在使用ConfigParser从配置文件加载数据,如下所示:
test.conf:
[myfiles]
fileone: %(datadir)s/somefile.foo
filetwo: %(datadir)s/nudderfile.foo
Run Code Online (Sandbox Code Playgroud)
load.py:
import ConfigParser
config = ConfigParser.ConfigParser({'datadir': '/tmp'})
config.read('test.conf')
print config.items('myfiles')
print config.get('myfiles', 'datadir')
Run Code Online (Sandbox Code Playgroud)
输出:
$ python load.py
[('datadir', '/tmp'), ('filetwo', '/tmp/nudderfile.foo'), ('fileone', '/tmp/somefile.foo')]
/tmp
Run Code Online (Sandbox Code Playgroud)
我很惊讶变量替换的默认值('datadir', '/tmp')是作为一部分出现的.items()并.get()返回,就像它们是配置文件中的值一样.这种行为有望吗?任何解决方法,以便我可以简单地迭代.items()而不获取那里的默认字典值,但仍然使用魔术插值?
参考:http://docs.python.org/library/configparser.html
谢谢!
更新:已经指出这是预期的行为:默认值与配置文件中的任何其他名称/值对一样.同样,配置文件中的名称/值对也可用于"魔术插值",所以如果我定义:
foo: bar
zap: %(foo)snowl
Run Code Online (Sandbox Code Playgroud)
我去拿 [... ('zap': 'barnowl')]
这非常简洁,但我仍然想知道我是否能完成我想要完成的任务:迭代我的配置文件中的名称/值对,插入变量,没有默认值.
我的具体情况是:我想用类似的东西初始化配置对象{basedir: '/foo/bar'},因为某些文件的绝对路径因安装而异.然后我需要传递该配置对象并让各种其他类遍历文件.我不希望每个读取配置的类都必须知道它是使用某些默认值初始化的,并且它应该忽略它们,因为它们不是实际文件.这可能吗?有什么方法可以隐藏.item()和.get()的默认值但仍有插值?谢谢!