如何获取“安全”和“往返”格式的类似yaml?

5
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版本以打印相似性?

1个回答

7
"safe"模式下的输出是PyYAML默认提供的“叶子集合”流式风格。这比默认值(typ="rt")的全块样式输出更紧凑,但并不总是增加可读性。特别是在总项目数较少(使得所有内容适配于一个窗口)或者叶集合有许多项(需要换行显示)时。

因此,round-trip默认为全块样式是因为我认为它看起来更好看。当然,当round-trip用于其预期目的时,每个集合的原始样式会被保留。

区别是由YAML()实例上的default_flow_style属性引起的,在"safe"模式下设置为None,在"rt"模式下设置为False

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,您将得到完全流程样式的输出。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接