Что лучше для создания файла настроек для программ Python, встроенного модуля (ConfigParser) или независимого проекта (ConfigObj) или с использованием формата сериализации данных YAML? Я слышал, что ConfigObj проще в использовании, чем ConfigParser, хотя он не является встроенной библиотекой. Я также прочитал, что PyYAML прост в использовании, хотя YAML занимает немного времени для использования. Простота реализации в стороне, что является лучшим вариантом для создания файла настроек/конфигурации?ConfigObj/ConfigParser против использования файла настроек YAML для Python
ответ
Использование ConfigObj по крайней мере очень прост и ini-файлы в вообще намного проще (и более широко используется), чем YAML. Для более сложных случаев, включая проверки, значения и типы по умолчанию, ConfigObj предоставляет способ сделать это с помощью проверки конфигов.
Простой код, чтобы прочитать INI файл с ConfigObj:
from configobj import ConfigObj
conf = ConfigObj('filename.ini')
section = conf['section']
value = section['value']
Он автоматически обрабатывает список значений для вас и позволяет многострочные значения. Если вы измените файл конфигурации, вы можете записать его обратно, сохраняя при этом порядок и комментарии.
Смотрите эти статьи для получения дополнительной информации, включая примеры проверки типа:
ConfigParser имеет очень плохой API, ConfigObj должен быть хорошим, но я никогда не использовал его, для ini-файлов я обычно реализую свой собственный парсер.
Однако ini-подобные форматы не обрабатывают разные типы, последовательности или рекурсивные отображения в любом случае, поэтому я бы просто использовал yaml. Его легко прочитать и отредактировать с помощью редактора, есть стандарт для разбора этих файлов, и у вас нет ни одного из упомянутых ниже-ini-подобных форматов.
Это зависит от того, что вы хотите хранить в вашей конфигурации файлы и способы их использования
Если круглые отключения (YAML → → код 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.
спасибо за указание ruamel.yaml. – jgomo3
Я пропустил отказ от авторских прав, автор автору этого сообщения также является автором 'ruamel.yaml'. – xmedeko
@xmedeko, на который ссылается '(бесстыдный плагин)', но я признаю, что он должен быть более явным (как я сделал в более поздних ответах, например [здесь] (http://stackoverflow.com/a/29415791/ 1307905) и [здесь] (http://stackoverflow.com/a/36631057/1307905). Этот ответ с самого начала я начал опубликовать ruamel.yaml. – Anthon
ConfigObj обрабатывает типы и последовательности прекрасно :-) – fuzzyman