Как я могу получить комментарии из файла YAML, используя ruamel.yaml в Python?

Я хотел бы получить строки комментариев из файла YAML, который я загрузил с помощью ruamel.yaml. В документации проекта отсутствует ссылка на API, и я не могу найти соответствующий пример. Как правильно получить доступ к комментариям?

import ruamel.yaml

yaml = """\
%YAML 1.2
---
# C1
a: # C2
  # C3
  # C4
  b: 1 # C5
  c: # A comment here will not be parsed properly by ruamel.yaml v0.11.14
  - abc # C6
  - xyz # C7
  # C8
# C9
"""

loaded = ruamel.yaml.round_trip_load(yaml)

# Now what?

person M. Dudley    schedule 07.07.2016    source источник
comment
Действительно, по-прежнему невозможно прокомментировать строку, в которой есть только ключ, и сохранить его должным образом. Это одна из причин отсутствия API, так как для этого ruamel.yaml должен быть более полным (включая поддержку этих редких случаев, для которых должна измениться базовая структура данных). Хранилищу комментариев также потребуются осмысленные имена атрибутов вместо индексов списка (в некотором зашифрованном порядке). ruamel.yaml должен избавиться от большего количества наследия PyYAML, а круговой обмен комментариями также должен работать при использовании этапов парсера на основе C.   -  person Anthon    schedule 07.07.2016
comment
И тогда, конечно, возникает проблема решения, принадлежит ли комментарий к собственной строке предыдущему скаляру или следующему и т. д.   -  person Anthon    schedule 07.07.2016


Ответы (1)


Автор библиотеки комментирует это в проблема с BitBucket (9 мая 2016 г.):

Сохранение комментариев не стабилизировалось, т.е. Мне нужно что-то сделать, если ключ и значение сопоставления не находятся в одной строке, а ключ (или оба ключа и значения) имеют комментарий. И моей первоначальной целью было сохранение существующих комментариев, а не столько манипуляция.

Путем некоторых экспериментов я определил следующие работы для примера кода, приведенного в вопросе выше:

print('Comment 1: ' + loaded.ca.comment[1][0].value)
print('Comment 2: ' + loaded.ca.items['a'][2].value)
print('Comment 3: ' + loaded.ca.items['a'][3][0].value)
print('Comment 4: ' + loaded.ca.items['a'][3][1].value)
print('Comment 5: ' + loaded['a'].ca.items['b'][2].value)
print('Comment 6: ' + loaded['a']['c'].ca.items[0][0].value)
print('Comment 7: ' + loaded['a']['c'].ca.items[1][0].value)
print('Comment 8: ' + loaded['a']['c'].ca.end[0].value)
print('Comment 9: ' + loaded['a']['c'].ca.end[1].value)
person M. Dudley    schedule 07.07.2016
comment
Да, в общем, если у вас есть объект сопоставления/слова, вы используете ca.items[key] to get the comments associated with the key, and similarly for sequences/list you use ca.items[index]` для определенного элемента. Манипуляции в _test/test_comment_manipulation.py могут также дать некоторые подсказки относительно того, как устанавливать новые комментарии. - person Anthon; 07.07.2016