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 中的一个错误,但我无意修复它。
代码:
#!/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 中的一个错误,但我无意修复它。