我使用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