我正在使用ruamel.yaml生成将由Tavern读取的YAML文件,该文件要求包含这样的列表:
includes:
- !include vars.yaml
尝试使用任何常用方法将数据作为字符串转储会导致single quotes being added around the tags,当下一个工具提取YAML时,此方法将无效。
如何从字典中定义的数据开始生成包含无引号的local tags的YAML文件?
我正在使用ruamel.yaml生成将由Tavern读取的YAML文件,该文件要求包含这样的列表:
includes:
- !include vars.yaml
尝试使用任何常用方法将数据作为字符串转储会导致single quotes being added around the tags,当下一个工具提取YAML时,此方法将无效。
如何从字典中定义的数据开始生成包含无引号的local tags的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