如何使用ruamel.yaml正确缩进序列?

时间:2017-06-06 11:21:45

标签: python ruamel.yaml

使用以下数据

from ruamel import yaml
data = {1: {1:[{1:1,2:2},{1:1,2:2}], 2:2}, 2: 42}

我的序列

的缩进不正确
>>> print yaml.round_trip_dump(data)
1:
  1:
  - 1: 1
    2: 2
  - 1: 1
    2: 2
  2: 2
2: 42

在Notepad ++上无法折叠。但是通过适当的缩进它可以工作:

为:

Bad Indent

好:

Good Indent

我尝试使用block_seq_indent=2

>>> print yaml.round_trip_dump(data, block_seq_indent=2)
1:
  1:
    - 1: 1
    2: 2
    - 1: 1
    2: 2
  2: 2
2: 42

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:9)

ruamel.yaml文档尽管通常缺乏,但会在缩进内显示以下关于offset短划线的内容:

  

如果偏移量等于序列,则没有足够的空间容纳短划线和必须遵循它的空间。在这种情况下,元素本身通常会被推送到下一行(而旧版本的ruamel.yaml就这样做了)。但这是无法发生的。但是,缩进级别是用于计算更深级别的累积缩进并指定sequence = 3 resp的级别。 offset = 2,可能会给出正确但反直觉的结果。

     

最好总是有序列> =偏移+ 2 ,但这不是强制执行。根据您的结构,不遵循此建议可能会导致无效输出

默认情况下indent(对于映射和序列)等于2,如果你这样做:

import sys
from ruamel import yaml

data = {1: {1:[{1:1,2:2},{1:1,2:2}], 2:2}, 2: 42}

yml = yaml.YAML()
yml.indent(mapping=2, sequence=4, offset=2)
yml.dump(data, sys.stdout)

你得到:

1:
  1:
    - 1: 1
      2: 2
    - 1: 1
      2: 2
  2: 2
2: 42

使用您在问题中使用的旧API,您不能以简单的方式对映射和序列进行不同的缩进(您需要子类化Emitter,并在基类的__init__上),设置值)。对于旧版本的ruamel.yaml,这根本不可能。

这仅适用于默认(往返,即typ='rt')转储程序,但适用于普通的Python dict和。 list(例如来自YAML(typ='safe').load(....))和 在进行YAML().load(....)

时使用的更多卷积子类

(以上要求ruamel.yaml> = 0.15.30)