gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 03:30:18 25 4
gpt4 key购买 nike

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

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 是否可以往返所需的输出:

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 样式重新出现。

如果你在上面的程序中插入 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

关于python - 强制字符串引用,同时保存流样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70852345/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com