gpt4 book ai didi

python - Pyyaml 嵌套对象

转载 作者:行者123 更新时间:2023-12-05 07:42:52 27 4
gpt4 key购买 nike

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

      - !Table
header:
- !Column
- !Paragraph
text: 'header1'
- !Column
- !Paragraph
text: 'header2'

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

当我想从 yaml.load() 函数构建对象时,出现以下错误:

yaml.constructor.ConstructorError: could not determine a constructor 
for the tag '!Column'
in "<unicode string>", line 19, column 17:
- !Column
^

最佳答案

使用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 编写一个表示器并将其添加到加载器。

关于python - Pyyaml 嵌套对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44157245/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com