pyyaml 无法加载 python 个对象
pyyaml failed to load python objects
使用 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
^
有没有人看到同样的错误?
显然在 PyYaml 的 5.4
版本中有一个修复,您可以在这里找到更多信息:https://github.com/yaml/pyyaml/pull/472.
但是,我不认为这种行为是预期的,我建议在 github 中打开一个问题。
尽管如此,我可以使用 yaml.UnsafeLoader
为您提供一个可行的解决方案(至少对于您的示例而言):
import yaml
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.load(s, Loader=yaml.UnsafeLoader)
print(r)
load_class()
您还需要阅读“构造器、表示器、解析器”部分,其中提供了有关使用 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)
使用 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
^
有没有人看到同样的错误?
显然在 PyYaml 的 5.4
版本中有一个修复,您可以在这里找到更多信息:https://github.com/yaml/pyyaml/pull/472.
但是,我不认为这种行为是预期的,我建议在 github 中打开一个问题。
尽管如此,我可以使用 yaml.UnsafeLoader
为您提供一个可行的解决方案(至少对于您的示例而言):
import yaml
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.load(s, Loader=yaml.UnsafeLoader)
print(r)
load_class()
您还需要阅读“构造器、表示器、解析器”部分,其中提供了有关使用 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)