我想用PyYaml解释以下YAML字符串:
- !Table
header:
- !Column
- !Paragraph
text: 'header1'
- !Column
- !Paragraph
text: 'header2'我有从yaml.YAMLObject类继承的表类和段落类。但是我不知道如何处理!Column标签?此标记应仅作为命名数组标记处理。
当我想要从yaml.load()函数构建对象时,我得到了以下错误:
yaml.constructor.ConstructorError: could not determine a constructor
for the tag '!Column'
in "<unicode string>", line 19, column 17:
- !Column
^发布于 2017-05-24 12:44:47
使用yaml.YAMLObject有两个问题
yaml.Loader之外,使用任何东西都是不透明的,这迫使您使用不安全的yaml.load(),这是您不应该做的,除非您现在和将来完全控制输入。您的!Table和!Paragraph是映射节点。但是,您的!Column是一个序列,您需要显式地为此创建一个构造函数:
import sys
from ruamel import yaml
yaml_str = """\
- !Table
header:
- !Column
- !Paragraph
text: 'header1'
- !Column
- !Paragraph
text: 'header2'
"""
class Table(yaml.YAMLObject):
yaml_tag = u'!Table'
pass
class Paragraph(yaml.YAMLObject):
yaml_tag = u'!Paragraph'
pass
def column_constructor(loader, node):
return loader.construct_sequence(node)
yaml.add_constructor('!Column', column_constructor)
data = yaml.load(yaml_str)
yaml.dump(data, sys.stdout, default_flow_style=False)这些指纹:
- !Table
header:
- - !Paragraph
text: header1
- - !Paragraph
text: header2和(因为我使用ruamel.yaml,也是一个UnsafeLoaderWarning)。
如果您希望输出包含!Column,那么您应该生成一个python类Column(list),并让column_constructor返回该类型,另外为Column编写一个代表并将其添加到加载程序中。
https://stackoverflow.com/questions/44157245
复制相似问题