如何为 "safe" 和 "round-trip" 获取格式相似的 yaml

How to get similarly formatted yaml for "safe" and "round-trip"

ruamel.yaml 根据它使用的是 safe 还是 round-trip 代表,以不同方式格式化一个简单但嵌套的字典。

我不明白为什么不同的代表应该以不同的方式格式化这么简单的字典,所以我想知道如何让 safe 代表看起来类似于 round-trip以下示例:

from ruamel.yaml import YAML
import sys

data = {'data': {'interval': 5, 'compression': '3'}, 'player': {'ffmpeg': {'name': 'me'}}}
yaml = YAML(typ='safe')
yaml.dump(data, sys.stdout)

这会打印

data: {compression: '3', interval: 5}
player:
  ffmpeg: {name: me}

但是

yaml = YAML()
yaml.dump(data, sys.stdout)

打印出更好的输出:

data:
  interval: 5
  compression: '3'
player:
  ffmpeg:
    name: me

如何获得 safe 版本以打印相似性?

"safe" 模式的输出是 PyYAML,ruamel.yaml 是 最初派生的,默认情况下,“叶集合”是流式的。 这比默认 (typ="rt") 的全块样式输出更紧凑, 这并不总是增加可读性。特别是在项目总数较少的情况下(因此总数适合 window), 或者当叶集合有很多项时(并且它们包含多行)。

所以往返默认为全块样式的原因是因为我同意它看起来 更好。当然,当往返用于其预期目的时, 保留每个系列的原始风格。

差异是由 YAML() 实例上的 default_flow_style 属性设置为 None 用于 "safe" 模式和 False "rt" 模式:

import sys
import ruamel.yaml

data = {'data': {'interval': 5, 'compression': '3'}, 'player': {'ffmpeg': {'name': 'me'}}}


yaml = ruamel.yaml.YAML(typ="safe")
yaml.default_flow_style = False
yaml.dump(data, sys.stdout)

给出:

data:
  compression: '3'
  interval: 5
player:
  ffmpeg:
    name: me

如果将该属性设置为 True,您将获得完全流式的输出。