强制字符串引用,同时保存流样式
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
我有数据,看起来有点像这样
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