Добавить комментарий в элемент списка в ruamel.yaml - PullRequest
1 голос
/ 06 июня 2019

Я динамически добавляю элементы в список в файле YAML, используя Python, и я хотел бы добавить комментарий рядом с каждым из добавляемых элементов.Ниже приведены все желаемые форматы:

flow_style_example:
  - [a, b, c] # first list
  - [d, e] # second list

block_style_example:
  - - a  # first list side comment
    - b
    - c
  # second list top comment
  - - d
    - e

list_of_elements_side_comment:
  - a # foo
  - b # bar

list_of_elements_top_comment:
  # comment 1
  - a
  # comment 2
  - b

Для любого из вышеперечисленного мне еще предстоит выяснить, как правильно создавать соответствующие записи CommentToken, особенно когда дело доходит до отметок (как определить линиюи что из того, что было только что добавлено?)

Как мне получить любой из вышеперечисленных функций?

1 Ответ

1 голос
/ 06 июня 2019

Вместо того, чтобы писать в своем вопросе, что вы хотели бы, было бы более полезным чтобы увидеть вашу программу, чтобы определить, что вы делали неправильно.

Поскольку вы смешиваете и сопоставляете стили отступов, вы не можете получить точный отступ, который вы хочу в одну свалку.

import sys
import ruamel.yaml
CS = ruamel.yaml.comments.CommentedSeq  # defaults to block style
CM = ruamel.yaml.comments.CommentedMap  # defaults to block style

def FS(x):  # flow style list
   res = CS(x)
   res.fa.set_flow_style()
   return res


yaml = ruamel.yaml.YAML()
yaml.indent(sequence=4, offset=2)

lst = CS()
lst.append(FS(['a', 'b', 'c']))
lst.append(FS(['d', 'e']))
lst.yaml_add_eol_comment("first list", 0, 0)
lst.yaml_add_eol_comment("second list\n\n", 1)
data = CM(flow_style_example=lst)

lst = CS()
data['block_style_example'] = lst
lst.append(CS(['a', 'b', 'c']))
lst[0].yaml_add_eol_comment("first list side comment", 0, 0)
lst.append(CS(['d', 'e']))
lst.yaml_set_comment_before_after_key(1, "second list top comment", 2)

lst = CS(['a', 'b'])
lst.yaml_add_eol_comment("foo", 0, 0)
lst.yaml_add_eol_comment("bar\n\n", 1)
data["list_of_elements_side_comment"] = lst
data.yaml_set_comment_before_after_key("list_of_elements_side_comment", "\n")

lst = CS(['a', 'b'])
lst.yaml_set_comment_before_after_key(0, "comment 1", 2)
lst.yaml_set_comment_before_after_key(1, "comment 2", 2)
data["list_of_elements_top_comment"] = lst


yaml.dump(data, sys.stdout)

, что дает:

flow_style_example:
  - [a, b, c] # first list
  - [d, e] # second list

block_style_example:
  -   - a # first list side comment
      - b
      - c
  # second list top comment
  -   - d
      - e

list_of_elements_side_comment:
  - a # foo
  - b # bar

list_of_elements_top_comment:
  # comment 1
  - a
  # comment 2
  - b

Обработка комментариев для CommentedSeq очень похожа на CommentedMap: комментарии в настоящее время хранятся как диктовка, где Индекс последовательности выполняет ту же функцию, что и ключ отображения, поэтому использование yaml_set_comment_before_after_key в последовательности / списке.

В приведенном выше примере используются внутренние элементы ruamel.yaml, которые могут измениться без уведомление cq. с уведомлением, но без вашего ведома. Поэтому (будьте готовы к) исправить номер версии ruamel.yaml, которую вы устанавливаете.

...