DoubleQuotedScalarString 如何应用于 CommentedMap

How does DoubleQuotedScalarString apply to a CommentedMap

当我使用ruamel.yaml库的CommentedMap存储有序字典时,需要将CommentedMap的内容作为字符串放入字典的值中,但是当我用 DoubleQuotedScalarString 操作它时,输出带有不需要的字段,如 ordereddict

import ruamel.yaml
from ruamel.yaml.comments import CommentedMap      # CommentedMap用于解决ordereddict数据dump时带"!omap"这样的字段
from ruamel.yaml.scalarstring import SingleQuotedScalarString,DoubleQuotedScalarString
from pathlib import Path
yaml = ruamel.yaml.YAML()
yaml.preserve_quotes = True
yaml.indent(mapping=4, sequence=6, offset=4)

file_yml = CommentedMap()
test = CommentedMap()
test['test1'] = "test1"
test['test2'] = "test2"
file_yml["test"] = DoubleQuotedScalarString(test)

path = Path("./test.yaml")
yaml.dump(file_yml, path)

结果如下

test: "ordereddict([('test1', 'test1'), ('test2', 'test2')])"

我期待的是测试的结果,"{'test1': 'test1', 'test2': 'test2'}"

如果你能告诉我如何实现它,我将不胜感激?

您不应将 DoubleQuotedScalarString 应用于 CommentedMap。前者唯一有用的是确保可能是映射或序列的一部分的单个字符串确实得到双引号。通过应用 CommentedMap,您将整个转换为字符串,并且 CommntedMap 是一个 ordereddict.

你应该这样做:

test = dict()

然后是:

file_yml["test"] = str(test)

在 Python 的现代版本中,这将保留键插入顺序,并且应添加引号,因为标量不能以 { 开头而不被自动引用。

如果测试在将其转储为字符串之前需要是 CommentedMap,则将其转换为字典:

test = CommentedMap()
.....
file_yaml["test"] = str(dict(test))