Утро доброе. Сегодня мы поговорим о том, как использовать Python для парсинга файлов конфигурации (жаль не сайтов). Бывает, что программе нужно достаточно много параметров, а помещать их все в качестве аргументов командной строки или переменных среды неудобно и нерационально. В таких случаях используется файл конфигурации.
Ниже представленные самые популярные форматы файлов конфигурации:
- почтенный (хотя иногда недостаточно определенный) формат INI,
- популярный, но иногда сложный для написания вручную формат JSON,
- обширный, но иногда удивительный в деталях формат YAML
- и новейшее дополнение TOML, о котором многие люди не слышали. Пока что.
Ваша первая задача – выбрать формат, а затем задокументировать этот выбор. Разобравшись с этой простой частью, можно заняться парсингом конфигурации.
Иногда рекомендуется иметь класс, соответствующий «абстрактным» данным в конфигурации. Поскольку этот код ничего не делает с конфигурацией, это самый простой способ показать логику парсинга с синтаксической точки зрения.
Представьте себе конфигурацию файлового процессора: он включает в себя входной каталог, выходной каталог и файлы, которые нужно выбрать.
Абстрактное определение класса конфигурации может выглядеть примерно так:
Чтобы упростить код, зависящий от формата, можно написать функцию, которая парсит этот класс из словаря. Обратите внимание: здесь предполагается, что в конфигурации будут использоваться дефисы, а не символы подчеркивания. Такое несоответствие не редкость.
JSON
JSON (JavaScript Object Notation) – это формат, подобный JavaScript.
Вот пример конфигурации в формате JSON:
Логика парсинга «встраивает» JSON во встроенные структуры данных Python (словари, списки, строки) с помощью модуля json, а затем создает класс из словаря:
INI
Формат INI, изначально популярный в операционной системе Windows, стал де-факто стандартом конфигурации.
Вот такая конфигурация у нас получится на INI:
Python может парсить его с помощью встроенного модуля configparser. Парсер ведет себя как dict-подобный объект, поэтому его можно передать напрямую в configuration_from_dict:
YAML
YAML (Yet Another Markup Language) – это расширение JSON, которое упрощает написание кода вручную. Отчасти это достигается за счет длинной спецификации.
Вот такая конфигурация будет в YAML:
Чтобы Python запарсил это, вам необходимо установить сторонний модуль. Самый популярный — PyYAML (pip install pyyaml). Парсер YAML также возвращает встроенные типы данных Python, которые можно передать в configuration_from_dict. Однако YAML-парсер ожидает поток, поэтому вам нужно преобразовать строку в поток.
TOML
TOML (Tom’s Own Markup Language) разработан как легкая альтернатива YAML. Спецификация здесь короче. И такой формат уже кое-где популярен (например, менеджер пакетов Rust, Cargo, использует ее для конфигурации своих пакетов).
А вот так будет выглядеть наша конфигурация на TOML:
Чтобы запарсить TOML, вам необходимо установить сторонний пакет. Самый популярный из них называется просто toml. Он возвращает базовые типы данных Python.
Заключение
Python обладает достаточно широким инструментарием для парсинга, о чем вы сегодня и узнали. Хоть выбор этого формата - дело не простое, но если же вы все таки выберете, то Python с большой вероятностью справиться с парсингом, нужно просто знать, чем воспользоваться.
Узнали ли вы что-то новое из данной статьи или уже осведомлены о таких возможностях? Пишите обо всем в комментарии, будет интересно почитать. Также задавайте вопросы, я обязательно на них отвечу.
И наконец, если хотите больше познавательного контента - подписывайтесь на канал и ставьте лайки!