代码:
#!/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/