Python 使用PyYAML加载自定义对象

Python 使用PyYAML加载自定义对象,python,yaml,pyyaml,Python,Yaml,Pyyaml,我有一个YAML文件,如下所示: !!com.example.hero.YAMLAnimals animals: Land: [Cow, Lion] Sea: [Salmon, Cod] 根据PyYAML文档,我应该能够通过子类化yaml.YAMLOBJECT安全地加载YAMLAnimals对象。我试着这样做: class YAMLAnimals(yaml.YAMLObject): yaml_tag = u'!com.example.hero.YAMLAnimals'

我有一个YAML文件,如下所示:

!!com.example.hero.YAMLAnimals
animals:
  Land: [Cow, Lion]
  Sea: [Salmon, Cod]
根据PyYAML文档,我应该能够通过子类化
yaml.YAMLOBJECT
安全地加载
YAMLAnimals
对象。我试着这样做:

class YAMLAnimals(yaml.YAMLObject):
    yaml_tag = u'!com.example.hero.YAMLAnimals'

    def __init__(self, animals):
        self.animals = animals
但是,当我尝试使用
yaml.load()
yaml.safe\u load()
解析文件时,我收到以下错误:

无法确定标记“tag:yaml.org,2002:com.example.hero.YAMLAnimals”的构造函数。

谢谢大家!

根据,
被认为是次要标签(按照惯例,意思是
标签:yaml.org,2002:
)。因此,您应该将
YAMLAnimals
中的
yaml\u标记从
u'更改!com.example.hero.YAMLAnimals'
u'tag:yaml.org,2002:com.example.hero.YAMLAnimals'
,以便解析
!!com.example.hero.YAMLAnimals
标记在YAML文件中

正如@mgrollins所指出的,您应该将
yaml.load
函数调用的
Loader
指定为
yaml.Loader
,作为当前问题的临时解决方法()

测试.yaml

!!com.example.hero.YAMLAnimals
animals:
  Land: [Cow, Lion]
  Sea: [Salmon, Cod]
Python代码:

import yaml

class YAMLAnimals(yaml.YAMLObject):
    yaml_tag = u'tag:yaml.org,2002:com.example.hero.YAMLAnimals'
    def __init__(self, animals):
        self.animals = animals

stream = open('test.yaml', 'r')
data = yaml.load(stream, Loader=yaml.Loader)
stream.close()
print(data.animals)
在文档中看到了这一点:
#在Python3中,也不要使用'u'前缀
,不是YAML专家,但注意到在您的类中只有一个bang
在字符串中。可能是一个未解决的问题: