#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. Комментарии есть к данным, иначе они не могли бы быть сохранены. Но при нынешнем способе подключения нетривиально пройти по структуре данных и переназначить их.