30 октября 2011 г.

Соблюдаем порядок секций при работе с конфиг файлом

Столкнулся с весьма забавной проблемой при работе с конфиг файлами, используя стандартную библиотеку ConfigParser. Дело в том, что до версии 2.7 эта библиотека не соблюдает порядок в котором расположены секции в конфиг файле, потому что хранит их в обыкновенном dict объекте. В версии же 2.7 библиотека использует добавленный в collections класс OrderedDict и никаких проблем с порядком нет.

Возможно, в целом это не должно являтся какой-то проблемой, но создавая интерфейс для редактирования значений в конфиг файле, хотелось давать пользователю всегда одинаковый результат, а не перемешивать секции и значения в секции от правки к правке.

Решение весьма простое, использовать dict_type при инициализации парсера, например так:

from ConfigParser import SafeConfigParser

from django.utils.datastructures import SortedDict


config = SafeConfigParser(dict_type=SortedDict)

Примечание: Я использовал здесь Django'вский SortedDict, но вы можете спокойно использовать свой объект, который соблюдает порядок значений при работе со словарем данных.

Единственный недостаток метода, что он будет работать только для Python 2.6, потому что поддержка dict_type появилась именно в этой версии. Для владельцев же более ранних версий возможно полезным будет узнать о неплохой альтернативе ConfigObj, в которой нет проблем с порядком данных и еще эта библиотека понимает комментарии в конфиг файлах :)

blog comments powered by Disqus