Я использую ConfigParser для загрузки данных из файла конфигурации следующим образом:Как исключить DEFAULT из Python ConfigParser .items()?
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(), но все еще иметь интерполяцию? Благодаря!
Я не могу понять, почему это поведение по умолчанию, не говоря уже, почему нет никакого способа, чтобы выключить его. –