ruamel.yaml.round_trip_dump 应有 4 个但找到 2 个(缩进)

ruamel.yaml.round_trip_dump expected 4 but found 2 (indentation)

代码:

#!/usr/bin/env python2

import sys
import ruamel.yaml

yaml_str = '''
---
project: ''
project_lead: &ptl
    name: ''
    company: ''
    email: ''
    id: ''
    timezone: ''
primary_contact: *ptl
committers:
    - <<: *ptl
    - name: ''
      email: ''
      company: ''
      id: ''
      timezone: ''
    - name: ''
      email: ''
      company: ''
      id: ''
      timezone: ''
'''


DATA = ruamel.yaml.round_trip_load(yaml_str, version=None, preserve_quotes=True)
indent = 4
block_seq_indent = 2
ruamel.yaml.round_trip_dump(DATA, sys.stdout, default_flow_style=True, indent=indent,
                            block_seq_indent=block_seq_indent)

输出:

project: ''
project_lead: &ptl
    name: ''
    company: ''
    email: ''
    id: ''
    timezone: ''
primary_contact: *ptl
committers:
  - <<: *ptl
  - name: ''
    email: ''
    company: ''
    id: ''
    timezone: ''
  - name: ''
    email: ''
    company: ''
    id: ''
    timezone: ''

问题:

foo.yaml|10 col 3 error| wrong indentation: expected 4 but found 2 (indentation)

如果我增加

block_seq_indent = 4

其后的值(电子邮件、公司、ID、时区)不遵循其缩进。

我的来源是 YAML 'wrong'?我可以解决这个问题吗? ruamel 模块很棒,我能够以编程方式添加值,但我似乎无法在输出中获得有效的 YAML。

您的输入在(嵌套)块映射上有四个位置缩进,即 project_lead 的值,并且它在序列上有六个缩进,即 committers 的值,带有四破折号的偏移量(在序列中,缩进被计算到序列元素的开头)。

如果您像现在这样使用旧的 API,这确实会出错,但是使用新的 API(以及适当的值),您可以:

import sys
import ruamel.yaml
from cStringIO import StringIO

yaml_str = '''\
---
project: ''
project_lead: &ptl
    name: ''
    company: ''
    email: ''
    id: ''
    timezone: ''
primary_contact: *ptl
committers:
    - <<: *ptl
    - name: ''
      email: ''
      company: ''
      id: ''
      timezone: ''
    - name: ''
      email: ''
      company: ''
      id: ''
      timezone: ''
'''

yaml = ruamel.yaml.YAML()
yaml.preserve_quotes = True
yaml.indent(mapping=4, sequence=6, offset=4)
yaml.explicit_start = True
data = yaml.load(yaml_str)
yaml.dump(data, sys.stdout)
buf = StringIO()
yaml.dump(data, buf)
assert buf.getvalue() == yaml_str

没有收到错误。

请注意:

  • default_flow_style=True 在您的示例中没有效果,它们只会影响新的映射和列表,我不确定您是否想对所有添加的值都这样做。
  • 我加了yaml.explicit_start = True得到前导---
  • 您的示例以一个空换行符开始(紧接在 ''' 之后,就好像您使用了 yaml_str = '\n---\nproject: .....')。您无法真正从数据结构中使用 ruamel.yaml() 获得该输出,因此 yaml_str.
  • 中的反斜杠
  • 虽然这可能被认为是旧 API 中的一个错误,但我无意修复它。