Python 使用泛型构造函数读取yaml文件

Python 使用泛型构造函数读取yaml文件,python,pyyaml,Python,Pyyaml,我需要使用pyyaml包读取python中的AWS cloudformation文件。这个问题似乎已经用这个代码片段解决了 def generic_constructor(loader, tag, node): classname = node.__class__.__name__ if (classname == 'SequenceNode'): return loader.construct_sequence(node) elif (classname

我需要使用pyyaml包读取python中的AWS cloudformation文件。这个问题似乎已经用这个代码片段解决了

def generic_constructor(loader, tag, node):
    classname = node.__class__.__name__
    if (classname == 'SequenceNode'):
        return loader.construct_sequence(node)
    elif (classname == 'MappingNode'):
        return loader.construct_mapping(node)
    else:
        return loader.construct_scalar(node)

yaml.add_multi_constructor('', generic_constructor)
如何使用此代码读取yaml文件

问题已在github上解决,这意味着此代码必须正常工作,才能读取问题报告者链接的yaml文件


答案是正确的。简而言之,有效的代码如下所示

import yaml

def generic_constructor(loader, tag, node):
    classname = node.__class__.__name__
    if classname == "SequenceNode":
        return loader.construct_sequence(node)
    elif classname == "MappingNode":
        return loader.construct_mapping(node)
    else:
        return loader.construct_scalar(node)

yaml.add_multi_constructor("", generic_constructor, Loader=yaml.SafeLoader)

with open("mytest.yaml") as f:
    data = yaml.safe_load(f)

一般的想法是,您的代码使用以下方法导入PyYAML:

import yaml
然后调用代码段,,它修改默认加载程序。由于PyYAML使用的默认加载程序在该问题解决后已更改,因此最好明确指定
SafeLoader

yaml.add_multi_constructor('', generic_constructor, Loader=SafeLoader)
然后使用
data=yaml.safe\u加载(打开文件或字符串)
加载数据

使用ruamel.yaml(免责声明:我是该软件包的作者)可能更容易,默认情况下,它可以处理特殊标签(包括AWS的标签),不过您应该指定十年前过时的yaml 1.1版本(这是AWS所期望的,也是PyYAML唯一支持的)


其中
x
可以是
pathlib.Path()
实例、打开的文件或字符串。

代码在哪里?不适用于该代码的示例AWS代码段在哪里?
from ruamel.yaml import YAML

yaml = YAML()
yaml.version = (1, 1)
data = yaml.load(x)