我有两个要写入单个 yaml 文件的 python 字典,其中包含两个文档:
definitions = {"one" : 1, "two" : 2, "three" : 3}
actions = {"run" : "yes", "print" : "no", "report" : "maybe"}
yaml 文件应如下所示:
--- !define
one: 1
two: 2
three: 3
-- !action
run: yes
print: no
report: maybe
...
使用 PyYaml 我没有找到明确的方法来做到这一点。我确信有一个简单的方法,但是深入研究 PyYaml 文档,只会让我感到困惑。我需要翻斗车、发射器还是什么?这些类型中的每一种都会产生什么类型的输出?Yaml 文本?yaml 节点?YAML 对象?无论如何,我将不胜感激任何澄清。
以下是unutbu的回答,这是我能想到的最简洁的版本:
DeriveYAMLObjectWithTag 是一个创建新类的函数,它从 YAMLObject 派生并带有所需的标签:
def DeriveYAMLObjectWithTag(tag):
def init_DeriveYAMLObjectWithTag(self, **kwargs):
""" __init__ for the new class """
self.__dict__.update(kwargs)
new_class = type('YAMLObjectWithTag_'+tag,
(yaml.YAMLObject,),
{'yaml_tag' : '!{n}'.format(n = tag),
'__init__' : init_DeriveYAMLObjectWithTag})
return new_class
以下是如何使用 DeriveYAMLObjectWithTag 获取所需的 Yaml:
definitions = {"one" : 1, "two" : 2, "three" : 3, "four" : 4}
actions = {"run" : "yes", "print" : "no", "report" : "maybe"}
namespace = [DeriveYAMLObjectWithTag('define')(**definitions),
DeriveYAMLObjectWithTag('action')(**actions)]
text = yaml.dump_all(namespace,
default_flow_style = False,
explicit_start = True)
感谢所有回答的人。我似乎在 PyYaml 中缺少功能,这是克服它的最优雅的方法。