强制字符串引用,同时保存流样式

Force string quoting, while saving flow style

我有数据,看起来有点像这样

data = {"a": {"a": "0.1.2", "b": "0.2.3"}, "c": 3}

我希望它创建一个 YAML 文档,应该如下所示

a: {a: "0.1.2", b: "0.2.3"}
c: 3

所以,默认情况下我们会有

yaml = ruamel.yaml.YAML()
data = {"a": {"a": "0.1.2", "b": "0.2.3"}, "c": 3}
yaml.dump(data, sys.stdout)

这给了我们这个

a:
  a: 0.1.2
  b: 0.2.3
c: 3

但我需要内联字典和引用字符串。
对于内联字典,我可以使用

yaml.default_flow_style = None

快到了

a: {a: 0.1.2, b: 0.2.3}
c: 3

对于字符串

from ruamel.yaml.scalarstring import SingleQuotedScalarString as dq

(我也可以使用 yaml.default_style = '"' 但它也引用了键并且对流程没有帮助)

事情是双引号以某种方式打破了流程:

yaml = ruamel.yaml.YAML()
yaml.default_flow_style = None
data = {"a": {"a": dq("0.1.2"), "b": dq("0.2.3")}, "c": 3}
yaml.dump(data, sys.stdout)

把这个还给我

a:
  a: "0.1.2"
  b: "0.2.3"
c: 3

如何获得所需的输出?

在这种情况下首先要做的是看看 ruamel.yaml 是否可以 round-trip 输出:

import sys
import ruamel.yaml

yaml_str = """\
a: {a: "0.1.2", b: "0.2.3"}
c: 3
"""

yaml = ruamel.yaml.YAML()
yaml.preserve_quotes = True
data = yaml.load(yaml_str)
yaml.dump(data, sys.stdout)

这正是您的输入:

a: {a: "0.1.2", b: "0.2.3"}
c: 3

如果你这样做:

yaml.default_flow_style = None

基本上所有只包含标量(作为元素 resp.键和值)的序列和映射都是 以流式倾倒。但是因为你包装了你想要的字符串 在您的输出中引用,转储过程不再将它们视为标量,这会导致 block-style 重新出现。

如果你在上面的程序中插入 print(type(data['a'])),你会看到映射 在 CommentedMap 中加载并且可以强制输出为流样式:

DQ = ruamel.yaml.scalarstring.DoubleQuotedScalarString
CM = ruamel.yaml.comments.CommentedMap 

cm = CM({"a": DQ("0.1.2"), "b": DQ("0.2.3")})
cm.fa.set_flow_style()
data = {"a": cm , "c": 3}
yaml.dump(data, sys.stdout)

给出:

a: {a: "0.1.2", b: "0.2.3"}
c: 3
  • 我不完全确定如何使用双引号:

    from ruamel.yaml.scalarstring import SingleQuotedScalarString as dq
    

    这就是我使用 DoubleQuotedScalarString 的原因。

  • 不需要设置yaml.default_flow_style = None