Я использую 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()
, как если бы они были значениями в файле конфигурации. Ожидается ли такое поведение? Какие-нибудь обходные пути, чтобы я мог просто итерировать .items()
, не получая значений словаря по умолчанию, но все еще используя магическую интерполяцию?
Ссылка: http://docs.python.org/library/configparser.html
Спасибо!
Обновление. Было указано, что это ожидаемое поведение: значения по умолчанию такие же, как и любая другая пара имя / значение в файле конфигурации. Точно так же пары имя / значение в файле конфигурации также доступны для «магической интерполяции», поэтому, если я определю:
foo: bar
zap: %(foo)snowl
Я получу [... ('zap': 'barnowl')]
Это довольно удобно, но мне все еще интересно, смогу ли я выполнить то, что хочу: перебирать пары имя / значение в моих файлах конфигурации с интерполяцией переменных без значений по умолчанию.
Мой конкретный сценарий таков: я хотел инициализировать объект конфигурации чем-то вроде {basedir: '/foo/bar'}
, поскольку абсолютные пути к определенным файлам зависят от установки. Затем мне нужно передать этот объект конфигурации и заставить другие классы перебирать файлы. Я не хочу, чтобы каждый класс, который читает конфигурацию, знал, что он был инициализирован с определенными значениями по умолчанию и что он должен их игнорировать, поскольку они не являются фактическими файлами. Это возможно? Есть ли способ скрыть значения по умолчанию из .item () и .get (), но все еще есть интерполяция? Спасибо!