如何使用 ruamel.yaml 添加评论
How can I add a comment with ruamel.yaml
我正在尝试使用 ruamel.yaml 创建一个数据结构,并希望在 转储 and/or 再次加载它之前添加注释 。
不幸的是,所有示例都首先使用往返转储程序加载一些字符串,或者使用不再存在的 API。
这就是我要转储的内容:
test: asdf # Test Comment!
我尝试了以下方法:
insert = ruamel.yaml.comments.CommentedMap()
start_mark = ruamel.yaml.error.CommentMark(0)
insert['test'] = 'asdf'
insert.ca.items['test'] = [ None,
[ruamel.yaml.CommentToken(value='# Test Comment!', start_mark=start_mark, end_mark=None)],
None,
None
]
ruamel.yaml.round_trip_dump(insert, sys.stdout)
打印。
# Test Comment!test: asdf
不知何故评论在前面而不是在值后面。
我做错了什么?
您可以尝试通过添加 CommentTokens
来做到这一点,但是
start_mark 类型必须来自 ruamel.yaml.error
.
使 insert
成为 CommentedMap
更容易(这就是
映射将被加载为,当执行正常时,round-trip,加载),
然后使用其 yaml_add_eol_comment
方法:
import sys
import ruamel.yaml
insert = ruamel.yaml.comments.CommentedMap()
insert['test'] = 'asdf'
insert.yaml_add_eol_comment('Test Comment!', 'test', column=0)
yaml = ruamel.yaml.YAML()
# yaml.indent(mapping=4, sequence=4, offset=2)
yaml.dump(insert, sys.stdout)
给出:
test: asdf # Test Comment!
column=0
是可选的。如果您不指定起始列,
你会在 #
之前得到两个空格,0 试图将它一直推到前面,但当然 key-value 对挡住了。
您可以在 #
中指定
您为 yaml_add_eol_comment
方法指定的 EOL 注释,但是如果
它不存在,它将被添加到前面。
如果您在连续多个键后有多个评论
行,并希望您的注释对齐,您只需指定
添加了第一个列。
参考最新文档,https://yaml.readthedocs.io/en/latest/example.html
CommentedMap
,即 round-trip 加载时得到的 dict
类结构,支持将键插入特定位置,同时可选择添加注释:
import sys
from ruamel.yaml import YAML
yaml_str = """\
key: value # first line and comment!
"""
yaml = YAML()
data = yaml.load(yaml_str)
data.insert(1, 'test', 'asdf', comment="Test Comment!")
yaml.dump(data, sys.stdout)
输出:
key: value # first line and comment!
test: asdf # Test Comment!
我正在尝试使用 ruamel.yaml 创建一个数据结构,并希望在 转储 and/or 再次加载它之前添加注释 。 不幸的是,所有示例都首先使用往返转储程序加载一些字符串,或者使用不再存在的 API。
这就是我要转储的内容:
test: asdf # Test Comment!
我尝试了以下方法:
insert = ruamel.yaml.comments.CommentedMap()
start_mark = ruamel.yaml.error.CommentMark(0)
insert['test'] = 'asdf'
insert.ca.items['test'] = [ None,
[ruamel.yaml.CommentToken(value='# Test Comment!', start_mark=start_mark, end_mark=None)],
None,
None
]
ruamel.yaml.round_trip_dump(insert, sys.stdout)
打印。
# Test Comment!test: asdf
不知何故评论在前面而不是在值后面。 我做错了什么?
您可以尝试通过添加 CommentTokens
来做到这一点,但是
start_mark 类型必须来自 ruamel.yaml.error
.
使 insert
成为 CommentedMap
更容易(这就是
映射将被加载为,当执行正常时,round-trip,加载),
然后使用其 yaml_add_eol_comment
方法:
import sys
import ruamel.yaml
insert = ruamel.yaml.comments.CommentedMap()
insert['test'] = 'asdf'
insert.yaml_add_eol_comment('Test Comment!', 'test', column=0)
yaml = ruamel.yaml.YAML()
# yaml.indent(mapping=4, sequence=4, offset=2)
yaml.dump(insert, sys.stdout)
给出:
test: asdf # Test Comment!
column=0
是可选的。如果您不指定起始列,
你会在 #
之前得到两个空格,0 试图将它一直推到前面,但当然 key-value 对挡住了。
您可以在 #
中指定
您为 yaml_add_eol_comment
方法指定的 EOL 注释,但是如果
它不存在,它将被添加到前面。
如果您在连续多个键后有多个评论 行,并希望您的注释对齐,您只需指定 添加了第一个列。
参考最新文档,https://yaml.readthedocs.io/en/latest/example.html
CommentedMap
,即 round-trip 加载时得到的 dict
类结构,支持将键插入特定位置,同时可选择添加注释:
import sys
from ruamel.yaml import YAML
yaml_str = """\
key: value # first line and comment!
"""
yaml = YAML()
data = yaml.load(yaml_str)
data.insert(1, 'test', 'asdf', comment="Test Comment!")
yaml.dump(data, sys.stdout)
输出:
key: value # first line and comment!
test: asdf # Test Comment!