ruamel-block_seq_indent和缩进

时间:2018-07-11 13:49:02

标签: yaml ruamel.yaml

使用yaml.round_trip_dump后,我一直在努力使YAML文件具有正确的缩进。我试图弄清楚block_seq_indentindent之间的区别。在文档中也找不到真正有用的东西。

1 个答案:

答案 0 :(得分:1)

indent是ruamel.yaml从PyYAML继承的普通缩进。它影响映射键和序列元素。对于序列,这意味着它不会影响序列元素前的哈希('-')。

因此,如果您运行:

import sys
import ruamel.yaml

d = dict(a=1, b=[1, 2, {3: [3.1, 3.2, 3.3]}], c=dict(d=1, e=2))

ruamel.yaml.safe_dump(d, sys.stdout, default_flow_style=False, explicit_start=True)
ruamel.yaml.safe_dump(d, sys.stdout, default_flow_style=False, indent=4, explicit_start=True)

输出将是:

---
a: 1
b:
- 1
- 2
- 3:
  - 3.1
  - 3.2
  - 3.3
c:
  d: 1
  e: 2
---
a: 1
b:
-   1
-   2
-   3:
    -   3.1
    -   3.2
    -   3.3
c:
    d: 1
    e: 2

如果您还提供block_seq_indent,则可以执行以下操作:

ruamel.yaml.safe_dump(d, sys.stdout, default_flow_style=False, indent=4, 
                  block_seq_indent=3, explicit_start=True)

获得:

a: 1
b:
   - 1
   - 2
   - 3:
       - 3.1
       - 3.2
       - 3.3
c:
    d: 1
    e: 2

要获得更多控制权,应使用新的ruamel.yaml API,您可以在其中执行以下操作:

yaml = ruamel.yaml.YAML()
yaml.indent(mapping=3, sequence=5, offset=2)
yaml.explicit_start = True
yaml.dump(d, sys.stdout)

获得:

a: 1
b:
  -  1
  -  2
  -  3:
       -  3.1
       -  3.2
       -  3.3
c:
   d: 1
   e: 2

即您可以使用offset将破折号放置在序列元素缩进的空格内。

已记录here