我有一个 YAML 文件,我只想解析 description 变量;但是,我知道我的 CloudFormation 模板(YAML 文件)中的感叹号给 PyYAML 带来了麻烦。

我收到以下错误:
yaml.constructor.ConstructorError: could not determine a constructor for the tag '!Equals'
该文件有很多 !Ref!Equals 。如何忽略这些构造函数并获得我正在寻找的特定变量——在这种情况下,是 description 变量。

最佳答案

您可以使用自定义 yaml.SafeLoader 定义自定义构造函数

import yaml

doc = '''
Conditions:
  CreateNewSecurityGroup: !Equals [!Ref ExistingSecurityGroup, NONE]
'''

class Equals(object):
    def __init__(self, data):
        self.data = data
    def __repr__(self):
        return "Equals(%s)" % self.data

class Ref(object):
    def __init__(self, data):
        self.data = data
    def __repr__(self):
        return "Ref(%s)" % self.data

def create_equals(loader,node):
    value = loader.construct_sequence(node)
    return Equals(value)

def create_ref(loader,node):
    value = loader.construct_scalar(node)
    return Ref(value)

class Loader(yaml.SafeLoader):
    pass

yaml.add_constructor(u'!Equals', create_equals, Loader)
yaml.add_constructor(u'!Ref', create_ref, Loader)
a = yaml.load(doc, Loader)
print(a)

输出:
{'Conditions': {'CreateNewSecurityGroup': Equals([Ref(ExistingSecurityGroup), 'NONE'])}}

关于python - 如果 YAML 中有 '!',如何使用 PyYAML 解析 YAML,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52240554/

10-11 06:18