Обратный анализ формата структуры данных (YAML или еще много чего) с сохранением комментариев для записи конфигурации - PullRequest
12 голосов
/ 04 августа 2011

Я использовал YAML в качестве формата файла конфигурации в нескольких приложениях, и все прошло хорошо, за исключением одного: когда моей программе нужно записать / изменить переменную конфигурации в файле конфигурации YAML, она уничтожает форматирование и комментарии путем загрузки и выгрузкивесь файл / структура.

(Ну, на самом деле есть еще одна проблема с YAML. Большинство пользователей, многие из которых не являются программистами, будут спотыкаться о деталях правил YAML, например о значении пробела в некоторыхместами. Но это не главное неудобство.)

Что я бы предпочел, так это загрузчик / дампер YAML, который может выполнять разбор туда и обратно (с сохранением всех пробелов и комментариев) или какой-либо другой читаемый человеком формат сериализацииу которого есть такой парсер.Я даже рассматриваю возможность использования документов Perl и PPI, так как PPI - это безопасный анализатор в обе стороны.Или, возможно, PPI можно использовать для работы с YAML или аналогичными форматами?Я бы предпочел не использовать XML, я бы прибегнул к INI + (JSON | YAML | ... для ключевых значений) до этого.

Любой совет или указатели?

Ответы [ 3 ]

9 голосов
/ 24 ноября 2014

Если вы используете блочную структуру YAML и Python приемлем, вы можно использовать пакет Python¹ ruamel.yaml , который является производным от PyYAML и поддерживает двустороннее сохранение комментариев :

import sys
import ruamel.yaml

inp = """\
# example
name:
  # details
  family: Smith   # very common
  given: Alice    # one of the siblings
"""

yaml = ruamel.yaml.YAML()

code = yaml.load(inp)
code['name']['given'] = 'Bob'

yaml.dump(code, sys.stdout)

с результатом:

# example
name:
  # details
  family: Smith   # very common
  given: Bob      # one of the siblings

Обратите внимание, что комментарии в конце строки все еще выровнены.

Вместо обычных list и dict объектов code состоит из завернутые версии², к которым прикреплены комментарии.

¹ Установить с pip install ruamel.yaml. Работает на Python 2.6 / 2.7 / 3.3 +. Отказ от ответственности: я являюсь автором этого пакета.
² ordereddict используется в случае отображения, чтобы сохранить порядок

3 голосов
/ 06 сентября 2011

Да, вы и все, кто думал, вау, yaml звучит круто , проще говоря, его не существует , но

обновление: вывероятно, вы хотите использовать Config :: General, его формат конфигурации apache (xmlish)

Нет, PPI не является инструментом общего назначения, если вы хотите BNF-ness, вы хотите использовать Marpa

Из всех INI / JSON / YAML/ XML, XML, вероятно, имеет лучшую поддержку редактора для непрограммистов (звучит безумно)

2 голосов
/ 06 сентября 2011

Одним из подходов к этому является использование «линз». См. Augeas для одной реализации.

...