如何在使用注释eol并在使用ruamel.yaml的yaml键之前避免错误?

时间:2019-07-17 21:16:27

标签: python ruamel.yaml

我正在从数据构造一个Yaml文件,并将注释添加到需要手动用户编辑的部分。对于每种数据类别,我都包含一个顶级注释,但我也想在列表项中包含行尾(eol)注释。尝试这样做时,我在ruamel代码内部遇到错误。

我正在使用ruamel.yaml 0.15.96。这是错误:

AttributeError: 'NoneType' object has no attribute 'append'

它发生在comments.py的{​​{1}}的第261行中。

我认为,因为我要设置eol注释,所以数据结构不同,因此,当我添加一个before注释时,此行将执行:yaml_set_comment_before_after_key 并失败,因为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

1 个答案:

答案 0 :(得分:0)

您的伪代码隐藏了您在做错的事情。如果您花时间去 举一个最小的非工作示例,该示例会生成该错误,您会注意到它会起作用。 然后,您可以重新确定错误在代码中的位置。

使用与您使用的相同的类和方法:

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