如何使用ruamel.yaml生成包含本地标签的YAML?

我正在使用ruamel.yaml生成将由Tavern读取的YAML文件,该文件要求包含这样的列表:

includes:
- !include vars.yaml

尝试使用任何常用方法将数据作为字符串转储会导致single quotes being added around the tags,当下一个工具提取YAML时,此方法将无效。

如何从字典中定义的数据开始生成包含无引号的local tags的YAML文件?

yichaohao 回答:如何使用ruamel.yaml生成包含本地标签的YAML?

我能够使用以下方法基于prior examples以所需的格式创建YAML文件。我的方法更灵活,因为它允许标记句柄是实例属性,而不是类属性,因此您不必为每个标记句柄定义不同的类。

import sys
from ruamel.yaml import YAML

yaml = YAML(typ='rt')

class TaggedString:    
    def __init__(self,handle,value):
        self.handle = handle
        self.value = value

    @classmethod
    def to_yaml(cls,representer,node):
        # I don't understand the arguments to the following function!
        return representer.represent_scalar(u'{.handle}'.format(node),u'{.value}'.format(node))

yaml.register_class(TaggedString)

data = {
    'includes': [
        TaggedString('!include','vars.yaml'),TaggedString('!exclude','dummy.yaml')
    ]
}

yaml.dump(data,sys.stdout)

输出:

includes:
- !include vars.yaml
- !exclude dummy.yaml

我不确定这是否是最佳方法。我可能会错过获得相同结果的更简单方法。注意,我的目标不是转储Python类。我这样做是为了使标签正确写入。

,

我不确定这是否是更好的方法,但是如果您尝试往返所需的输出,则您 会发现ruamel.yaml实际上可以保留您标记的字符串,而无需您 做任何事情。检查Python数据结构,您会注意到ruamel.yaml确实 通过创建TaggedScalar(因为您不能将属性附加到内置字符串类型)来实现此目的。

import sys
import ruamel.yaml

yaml_str = """\
includes:
- !include vars.yaml
- !exclude dummy.yaml
"""

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

incl = data['includes'][0]
print(type(incl))

给出:

includes:
- !include vars.yaml
- !exclude dummy.yaml
<class 'ruamel.yaml.comments.TaggedScalar'>

检查comments.py(并可能检查constructor.py)之后,您应该能够 快速制作ruamel.yaml的内部数据结构:

import sys
import ruamel.yaml
from ruamel.yaml.comments import TaggedScalar

def tagged_string(tag,val):
    # starting with ruamel.yaml>0.16.5 you can replace the following lines with:
    # return TaggedScalar(value=val,tag=tag)
    ret_val = TaggedScalar()
    ret_val.value = val
    ret_val.yaml_set_tag(tag)
    return ret_val

yaml = ruamel.yaml.YAML()
data = dict(includes=[tagged_string('!include',tagged_string('!include',])
yaml.dump(data,sys.stdout)

这还提供:

includes:
- !include vars.yaml
- !include vars.yaml
本文链接:https://www.f2er.com/3162539.html

大家都在问