Разбор предшествующих комментариев в YAML с помощью ruamel.yaml

#python #yaml #ruamel.yaml

Вопрос:

Моя проблема

У меня есть yaml с такими комментариями

 # comment A
a: 1  # also comment a
# comment B
b:  # comment B
  # comment B1
  b1: 1 # comment b1 
  b2: 2 # comment b2
# comment C
c: 3
 

Когда я пытаюсь разобраться в этом с руамелем.yaml (чтобы отсортировать его по другому yaml, сохраняя комментарии, прикрепленные к правильным ключам), я получаю комментарии, связанные с неправильными ключами:

 root [None, [CommentToken('# comment An', line: 1, col: 0)]]
a [None, None, CommentToken('# also comment an# comment Bn', line: 2, col: 6), None]
b [None, None, CommentToken('# comment Bn  # comment B1n', line: 4, col: 4), None]
b1 [None, None, CommentToken('# comment b1 n', line: 6, col: 8), None]
b2 [None, None, CommentToken('# comment b2n# comment Cn', line: 7, col: 8), None]
 

Есть ли способ сделать руамель.yaml правильно прикрепляет комментарии к соответствующим ключам?

Примеры того, какими я хочу их видеть:

 b1 [None, CommentToken('# comment Bn', line: x, col: x), CommentToken('# comment b1 n', line: x, col: x), None]
b2 [None, None, CommentToken('# comment b2n', line: x, col: x), None]
c [None, None, CommentToken('# comment Cn', line: x, col: x), None]
 

Версии:

 python=3.9.5
ruamel.yaml=0.17.16
 

Что я пытался

 y = YAML(typ='rt', pure=True)
y.comment_handling = C_PRE
 

Но, похоже, это не должно так работать:

   File "...libsite-packagesruamelyamlconstructor.py", line 1531, in construct_mapping
    if value_node.comment[2]:
IndexError: list index out of range
 

typ="rtsc" , но это не работает в моем случае (при необходимости можно опубликовать полный трассировку стека):

   File "...libsite-packagesruamelyamlemitter.py", line 683, in expect_block_mapping_key
    if self.event.comment and self.event.comment[1]:
IndexError: list index out of range

 

Комментарии:

1. Мне все это кажется хорошим, и поведение задокументировано. ruamel.yaml объединяет комментарии в конце строки (даже пустые) со следующими пустыми строками и строками с полными комментариями в один комментарий с несколькими ссылками, который присоединяется к последнему проанализированному узлу. Я начал разбираться в том, что не делаю этого таким образом (с другой схемой разделения многострочного комментария и прикрепления некоторых к следующему узлу), но в настоящее время у меня возникли некоторые проблемы с финансированием этой работы.

2. @Anthon итак, нет способа изменить способ, которым библиотека прикрепляет комментарии к ключам в текущей реализации? Ну что ж, в любом случае спасибо за ответ! Надеюсь, в конце концов вы сможете реализовать другую реализацию. О, и кстати о документировании: немного больше комментариев в коде тоже было бы удобно, было нелегко понять, как объекты комментариев хранятся в словаре ca.items =)

3. Комментарии есть к данным, иначе они не могли бы быть сохранены. Но при нынешнем способе подключения нетривиально пройти по структуре данных и переназначить их.