yaml - ruamel.yaml.round_trip_dump 预期为 4,但发现为 2(缩进)

标签 yaml ruamel.yaml

代码:

#!/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 是否“错误”?我可以解决这个问题吗? ruamel 模块很棒,我能够以编程方式添加值,但我似乎无法在输出中获得有效的 YAML。

最佳答案

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

如果您像以前一样使用旧 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 中的一个错误,但我无意修复它。

关于yaml - ruamel.yaml.round_trip_dump 预期为 4,但发现为 2(缩进),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51179530/

相关文章:

kubernetes - Terraform Kubernetes 供应商 "local-exec"kubectl apply -f -<<EOF 在 Windows 上不起作用

ruby - 从 yaml 文件中读取数据并在 ruby​​ 中生成一个数组

java - 如何将 application.properties 转换为 map 的 application.yml

bash - 如何在 GitHub 工作流中的 YAML 文件中设置包含空格的路径?

python - 在鲁梅尔往返时保留长单线字符串

python - 将数据类型声明为 ruamel.yaml 以便它可以表示/序列化它?

yaml - 将 YAML 文件转换为 vault kv put 的属性文件

Python ruamel.yaml 转储带引号的标签

python - 根据 YAML 1.1 规范, 'yes' 真的是 'true' 的别名吗? 1.2规范?

python - Ruamel yaml 导入不起作用