这里的问题是空行被认为是一种注释,并且注释在ruamel.yaml
通过将它们与序列中的元素或映射中的键相关联来保留。该值存储在名为的复杂属性中ca
,在列表中类似对象doc['phase1']
,与第二个元素相关联。
您当然可以认为它应该与顶级映射/字典相关联,或者与键相关联phase1
(作为最后的空行注释)或与phase2
作为一些介绍性的空行评论。
上述三者中的任何一个都是有效的,并且当前库中无法控制空行(或注释所在)的策略。
如果您输入“真实”评论(以#
) it will可以与相关联的phase1
最后,对于那些人来说,策略是不同的。
这显然需要彻底改革,因为最初的目标ruamel.yaml
曾是:
- 从 YAML 加载一些配置
- 改变一些值
- 将配置保存到 YAML
在这种情况下,不会出现此类追加/插入问题。
因此,在对库进行扩展并控制附加(尾随)注释和/或空行的位置之前,没有真正的解决方案。
在实施此类控制之前,您可以做的最好的事情可能是以下:
import sys
import ruamel.yaml
yaml_str = """\
phase1:
- a
# a comment.
- b
phase2:
- d
"""
def append_move_comment(l, e):
i = len(l) - 1
l.append(e)
x = l.ca.items[i][0] # the end comment
if x is None:
return
l.ca.items[i][0] = None
l.ca.items[i+1] = [x, None, None, None]
data = ruamel.yaml.round_trip_load(yaml_str)
append_move_comment(data['phase1'], 'c')
ruamel.yaml.round_trip_dump(data, sys.stdout, indent=4, block_seq_indent=2)
我改变了indent
值为 4,这是您的输入所具有的值(并且因为您将其指定为较小的 block_seq_indent 而获得)。