在 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 的版本号。
我正在使用 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 的版本号。