在 ruamel.yaml 中的列表元素中添加评论

Add a comment in list element in ruamel.yaml

我正在使用 Python 在 YAML 文件的列表中动态添加元素,我想在我添加的每个元素旁边添加一条评论。以下是所有需要的格式:

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 条目,尤其是涉及标记时(如何确定刚刚添加的内容的行和列?)

如何实现任意以上功能?

与其在你的问题中写下你会喜欢什么,不如这样更有用 查看您的程序,确定您做错了什么。

因为您混用和匹配了缩进样式,您无法获得您想要的准确缩进 想要一个转储。

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: 评论当前存储为字典,其中 序列索引实现与映射键相同的功能,因此 在 sequence/list.

上使用 yaml_set_comment_before_after_key

上面使用了 ruamel.yaml 的内部结构,它可能会在没有 注意cq。有通知,但你没有注意到。因此(准备好 to) 修正你安装的 ruamel.yaml 的版本号。