在使用 ruamel.yaml 向 yaml 应用注释 eol 和键之前如何避免错误?
How to avoid an error when applying comments eol and before a key to yaml using ruamel.yaml?
我正在根据数据构建一个 yaml 文件,并向需要用户手动编辑的部分添加注释。对于每个类别的数据,我都包括一个顶级评论,但我还想在列表项上包括行尾 (eol) 评论。我在尝试此操作时遇到 ruamel 代码内部错误。
我正在使用 ruamel.yaml 0.15.96。这是错误:
AttributeError: 'NoneType' object has no attribute 'append'
它出现在 comments.py
,第 261 行,在 yaml_set_comment_before_after_key
。
我想因为我设置了一个eol注释,数据结构不同,所以当我添加一个before注释时,这一行执行:c[1].append(comment_token(com, start_mark))
并失败,因为 c[1]
是 None
而不是 []
.
# Pseudocode, removed irrelevant details
data = CommentedMap(TopLevelData)
data.yaml_set_start_comment(TOP_LEVEL_COMMENT)
temp_list = CommentedSeq()
for top_comment, start_index, matches in match_categories:
components = self._matches_to_components(matches)
for idx, subcomponent in enumerate(components):
temp_list.append(data)
temp_list.yaml_add_eol_comment(comment=inline_comment,
key=idx)
temp_list.yaml_set_comment_before_after_key(key=start_index,
before=top_comment,
indent=OFFSET)
data['subcomponents'] = temp_list
我希望输出看起来像这样:
# TOP_LEVEL_COMMENT
name: hydrated-cluster
subcomponents:
# top_comment
- data: elasticsearch-fluentd-kibana # inline comment
你的pseudo-code隐藏了你做错了什么。如果你愿意花时间
制作一个生成该错误的最小 non-working 示例,您会注意到它会正常工作。
从那里您可以回过头来确定代码中的错误所在。
使用与您使用的相同 类 和方法:
import sys
import ruamel.yaml
from ruamel.yaml.comments import CommentedMap, CommentedSeq
data = CommentedMap(dict(name="hydrated-cluster"))
data.yaml_set_start_comment("TOP_LEVEL_COMMENT")
temp_list = CommentedSeq()
d2 = CommentedMap(data="elasticsearch-fluentd-kibana")
d2.yaml_add_eol_comment(comment="# inline comment", key='data')
data['subcomponents'] = l3 = CommentedSeq([d2])
l3.yaml_set_comment_before_after_key(key=0, before="top comment", indent=2)
yaml = ruamel.yaml.YAML()
yaml.indent(sequence=4, offset=2)
yaml.dump(data, sys.stdout)
上面给出了你所期望的:
# TOP_LEVEL_COMMENT
name: hydrated-cluster
subcomponents:
# top comment
- data: elasticsearch-fluentd-kibana # inline comment
我正在根据数据构建一个 yaml 文件,并向需要用户手动编辑的部分添加注释。对于每个类别的数据,我都包括一个顶级评论,但我还想在列表项上包括行尾 (eol) 评论。我在尝试此操作时遇到 ruamel 代码内部错误。
我正在使用 ruamel.yaml 0.15.96。这是错误:
AttributeError: 'NoneType' object has no attribute 'append'
它出现在 comments.py
,第 261 行,在 yaml_set_comment_before_after_key
。
我想因为我设置了一个eol注释,数据结构不同,所以当我添加一个before注释时,这一行执行:c[1].append(comment_token(com, start_mark))
并失败,因为 c[1]
是 None
而不是 []
.
# Pseudocode, removed irrelevant details
data = CommentedMap(TopLevelData)
data.yaml_set_start_comment(TOP_LEVEL_COMMENT)
temp_list = CommentedSeq()
for top_comment, start_index, matches in match_categories:
components = self._matches_to_components(matches)
for idx, subcomponent in enumerate(components):
temp_list.append(data)
temp_list.yaml_add_eol_comment(comment=inline_comment,
key=idx)
temp_list.yaml_set_comment_before_after_key(key=start_index,
before=top_comment,
indent=OFFSET)
data['subcomponents'] = temp_list
我希望输出看起来像这样:
# TOP_LEVEL_COMMENT
name: hydrated-cluster
subcomponents:
# top_comment
- data: elasticsearch-fluentd-kibana # inline comment
你的pseudo-code隐藏了你做错了什么。如果你愿意花时间 制作一个生成该错误的最小 non-working 示例,您会注意到它会正常工作。 从那里您可以回过头来确定代码中的错误所在。
使用与您使用的相同 类 和方法:
import sys
import ruamel.yaml
from ruamel.yaml.comments import CommentedMap, CommentedSeq
data = CommentedMap(dict(name="hydrated-cluster"))
data.yaml_set_start_comment("TOP_LEVEL_COMMENT")
temp_list = CommentedSeq()
d2 = CommentedMap(data="elasticsearch-fluentd-kibana")
d2.yaml_add_eol_comment(comment="# inline comment", key='data')
data['subcomponents'] = l3 = CommentedSeq([d2])
l3.yaml_set_comment_before_after_key(key=0, before="top comment", indent=2)
yaml = ruamel.yaml.YAML()
yaml.indent(sequence=4, offset=2)
yaml.dump(data, sys.stdout)
上面给出了你所期望的:
# TOP_LEVEL_COMMENT
name: hydrated-cluster
subcomponents:
# top comment
- data: elasticsearch-fluentd-kibana # inline comment