Как исключить ЗНАЧЕНИЯ ПО УМОЛЧАНИЮ из Python ConfigParser .items ()?

Я использую 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() возвраты, как будто они были значениями в конфигурационном файле. Это поведение ожидается? Любая работа arounds, так, чтобы я мог просто выполнить итерации .items() не получая словарь по умолчанию оценивает там, но все еще с помощью волшебной интерполяции?

Ссылка: http://docs.python.org/library/configparser.html

Спасибо!

Обновление: было указано, что это - ожидаемое поведение: значения по умолчанию точно так же, как любая другая пара имя/значение в конфигурационном файле. Точно так же пары имя/значение в конфигурационном файле также доступны для "волшебной интерполяции", поэтому если я определяю:

foo: bar
zap: %(foo)snowl

Я доберусь [... ('zap': 'barnowl')]

Это круто, но я все еще задаюсь вопросом, могу ли я выполнить то, что я хочу выполнить: выполните итерации по парам имя/значение в моих конфигурационных файлах, с интерполяцией переменных, без значений по умолчанию.

Мой определенный сценарий - это: Я хотел инициализировать объект конфигурации с чем-то как {basedir: '/foo/bar'}, как полные пути в определенные файлы варьируется установкой. Затем я должен раздать тот объект конфигурации к и иметь различные другие классы, выполняют итерации через файлы. Я не хочу каждый класс, который читает конфигурацию, чтобы должным быть знать, что это было инициализировано с определенными значениями по умолчанию и что это должно проигнорировать их, поскольку они не фактические файлы. Действительно ли это возможно? Какой-либо способ скрыть значения по умолчанию от .item () и .get (), но все еще иметь интерполяцию?Спасибо!

15
задан Gringo Suave 11 January 2013 в 09:46
поделиться

1 ответ

Попробуйте следующее:

config = ConfigParser.ConfigParser({'blahblahblah': 'blah'})
config.read('test.conf')

Ключ blahblahblah также появится в items, не потому что это шаблон в .ini файле, а потому что вы указали его по умолчанию. Вот как ConfigParser относится к настройкам по умолчанию: если он не может найти их в файле, он присваивает им значения по умолчанию.

Так что мне кажется, что у вас тут простая путаница понятий.

1
ответ дан 1 December 2019 в 04:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: