【问题标题】:Add a comment in list element in ruamel.yaml在 ruamel.yaml 的列表元素中添加注释
【发布时间】:2026-02-18 21:25:01
【问题描述】:

我正在使用 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 条目,尤其是在标记方面(如何确定刚刚添加的行和列?)

我怎样才能实现上述任何功能?

【问题讨论】:

标签: python-3.x yaml pyyaml ruamel.yaml


【解决方案1】:

与其在你的问题中写下你会欣赏的东西,它会更有用 查看您的程序,确定您做错了什么。

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

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: cmets 当前存储为字典,其中 序列索引实现与映射键相同的功能,因此 在序列/列表中使用yaml_set_comment_before_after_key

上面使用了 ruamel.yaml 的内部结构,它可能会在没有变化的情况下发生变化 注意cq。有通知,但没有你注意。因此(做好准备 to) 修复您安装的 ruamel.yaml 的版本号。

【讨论】:

  • 感谢您的快速回复。 > “与其在你的问题中写下你会欣赏的东西,不如看看你的程序,确定你做错了什么会更有用。”:我试图将元素与它们的 cmets 一起添加到列表,搞乱ca.items之类的东西。正是由于我在搞乱内部结构,这通常是不需要的,我认为如果我发布我想要实现的目标会不会那么混乱。作为旁注,感谢您如此积极地支持 ruamel.yaml。