ConfigObj / ConfigParser против использования YAML для файла настроек Python

Что лучше для создания файла настроек для программ Python, встроенного модуля (ConfigParser) или независимого проекта (ConfigObj) или использования формата сериализации данных YAML? Я слышал, что ConfigObj проще в использовании, чем ConfigParser, хотя это не встроенная библиотека. Я также читал, что PyYAML прост в использовании, хотя использование YAML занимает немного времени. Помимо простоты реализации, что является лучшим вариантом для создания файла настроек / конфигурации?


person Apophenia Overload    schedule 09.08.2010    source источник


Ответы (3)


Использование ConfigObj, по крайней мере, очень просто, а файлы ini в общем намного проще (и используются более широко), чем YAML. Для более сложных случаев, включая проверку, значения и типы по умолчанию, ConfigObj предоставляет способ сделать это с помощью проверки configspec.

Простой код для чтения ini-файла с помощью ConfigObj:

from configobj import ConfigObj

conf = ConfigObj('filename.ini')
section = conf['section']
value = section['value']

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

См. Эти статьи для получения дополнительной информации, включая примеры проверки типа:

person fuzzyman    schedule 12.08.2010

Это зависит от того, что вы хотите сохранить в своих файлах конфигурации и как вы их используете.

  • Если вы выполняете циклическое переключение (yaml → code → yaml) и хотите сохранить комментарии, вы не можете использовать PyYAML или ConfigParser.

  • Если вы хотите сохранить порядок ваших ключей (например, когда вы проверяете свои файлы конфигурации), PyYAML не сделает этого, если вы не укажете !!omap (что делает обновление менее простым, чем обычное сопоставление)

  • Если вы хотите иметь сложные структуры со списками безымянных элементов, содержащих сопоставления / словари, тогда ConfigParser и ConfigObj вам не помогут, поскольку пары ключ-значение файлов INI должны входить в разделы, а списки могут быть только значениями.

Реализация программы чтения YAML ruamel.yaml поддерживает все вышеперечисленное ¹. Я долгое время использовал отличный ConfigObj от fuzzyman для сохранения комментариев туда и обратно, а также PyYAML для более сложных структур, и он сочетает в себе лучшее из обоих миров. ruamel.yaml включает утилиту yaml, которая может конвертировать ConfigObj файлы INI в YAML.


¹ ruamel.yaml - это библиотека YAML, которая поддерживает YAML 1.2 (я рекомендую использовать ее, но тогда я являюсь автором пакета). PyYAML поддерживает только (большую часть) YAML 1.1.

person Anthon    schedule 24.11.2014
comment
Я пропустил заявление об отказе от ответственности, что автор этого сообщения также является автором ruamel.yaml. - person xmedeko; 01.08.2016
comment
@xmedeko - это то место, где обозначается (shameless plug), но я признаю, что это должно быть более явным (как я делал в более поздних ответах, например здесь и здесь. Это ответ сразу после того, как я начал публиковать ruamel.yaml. - person Anthon; 01.08.2016

У ConfigParser действительно плохой API, ConfigObj должен быть хорошим, но я никогда его не использовал, для ini-файлов я обычно использую свой собственный парсер.

Однако ini-подобные форматы в любом случае плохо обрабатывают различные типы, последовательности или рекурсивные сопоставления, поэтому я бы просто использовал yaml. Их легко читать и редактировать с помощью редактора, существует стандарт для анализа этих файлов, и у вас нет ни одного из упомянутых недостатков, которые есть у ini-подобных форматов.

person DasIch    schedule 09.08.2010
comment
ConfigObj отлично справляется с типами и последовательностями :-) - person fuzzyman; 12.08.2010