首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pyyaml嵌套对象

Pyyaml嵌套对象
EN

Stack Overflow用户
提问于 2017-05-24 11:35:30
回答 1查看 2.1K关注 0票数 3

我想用PyYaml解释以下YAML字符串:

代码语言:javascript
复制
      - !Table
        header:
          - !Column
            - !Paragraph
              text: 'header1'
          - !Column 
            - !Paragraph
              text: 'header2'

我有从yaml.YAMLObject类继承的表类和段落类。但是我不知道如何处理!Column标签?此标记应仅作为命名数组标记处理。

当我想要从yaml.load()函数构建对象时,我得到了以下错误:

代码语言:javascript
复制
yaml.constructor.ConstructorError: could not determine a constructor 
for the tag '!Column'
in "<unicode string>", line 19, column 17:
              - !Column
                ^
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-24 12:44:47

使用yaml.YAMLObject有两个问题

  • 除了默认的yaml.Loader之外,使用任何东西都是不透明的,这迫使您使用不安全的yaml.load(),这是您不应该做的,除非您现在和将来完全控制输入。
  • 不能将其用于由标量或序列组成的节点对象。只能使用映射。

您的!Table!Paragraph是映射节点。但是,您的!Column是一个序列,您需要显式地为此创建一个构造函数:

代码语言:javascript
复制
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)

这些指纹:

代码语言:javascript
复制
- !Table
  header:
  - - !Paragraph
      text: header1
  - - !Paragraph
      text: header2

和(因为我使用ruamel.yaml,也是一个UnsafeLoaderWarning)。

如果您希望输出包含!Column,那么您应该生成一个python类Column(list),并让column_constructor返回该类型,另外为Column编写一个代表并将其添加到加载程序中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44157245

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档