8

有以下数据

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++ 上不能折叠。但是,使用适当的缩进它可以工作:

坏的:

缩进不好

好的:

良好的缩进

我试过使用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

我该如何解决这个问题?

4

1 回答 1

14

ruamel.yaml文档虽然普遍缺乏,但offset对缩进中的破折号进行了以下说明:

如果偏移量等于序列,则没有足够的空间放置破折号和必须跟随它的空间。在这种情况下,元素本身通常会被推送到下一行(旧版本的 ruamel.yaml 会这样做)。但这被阻止发生。然而,缩进级别用于计算更深级别的累积缩进并指定序列= 3 。offset=2,可能会给出正确但与直觉相反的结果。

最好总是让 sequence >= offset + 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 dictresp。list(例如 from YAML(typ='safe').load(....))及其在做时使用的更复杂的子类YAML().load(....)

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

于 2017-06-06T11:43:50.093 回答