首页 > 解决方案 > pyyaml 无法加载 python 对象

问题描述

对于 python 3.8、pyyaml 5.4.1,官方 pyyaml 文档中用于加载 python 对象的简单示例https://pyyaml.docsforge.com/master/documentation/#loading-yaml无法正常工作。

相同的示例适用于 pyyaml 5.3.1、5.3、5.1。

这是上面示例中采用的完整代码。

class Hero:
    def __init__(self, name, hp, sp):
        self.name = name
        self.hp = hp
        self.sp = sp

    def __repr__(self):
        return "%s(name=%r, hp=%r, sp=%r)" % (
            self.__class__.__name__, self.name, self.hp, self.sp)


def load_class():
    s = """
!!python/object:__main__.Hero
name: Welthyr Syxgon
hp: 1200
sp: 0
"""
    r = yaml.full_load(s)
    print(r)

load_class()

我收到一个错误:

    raise ConstructorError(None, None, yaml.constructor.ConstructorError: could not determine a constructor for the tag 'tag:yaml.org,2002:python/object:__main__.Hero'   in "<unicode string>", line 2, column 1:
    !!python/object:__main__.Hero
    ^

有没有人看到同样的错误?

标签: pythonpyyaml

解决方案


您还需要阅读“构造函数、表示器、解析器”部分,其中提供了有关使用 YAML 对象的更多详细信息,例如

import yaml

class Hero(yaml.YAMLObject):
    yaml_tag = "!Hero"
    def __init__(self, name, hp, sp):
        self.name = name
        self.hp = hp
        self.sp = sp

    def __repr__(self):
        return "%s(name=%r, hp=%r, sp=%r)" % (self.__class__.__name__, self.name, self.hp, self.sp)

hero = yaml.load("""
!Hero
hp: -3
name: Galain Ysseleg
sp: 2
""", Loader=yaml.Loader)

print(hero)

输出是Hero(name='Galain Ysseleg', hp=-3, sp=2)


推荐阅读