PyYAML文档示例用!!python/object构造类实例报错排查
PyYAML 自定义类实例加载异常整理
在PyYAML官方文档的YAML加载章节中,有如下表述:
即使是Python类的实例,也可以通过
!!python/object标签完成构造。
官方给出的交互演示示例代码:
>>> 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) >>> yaml.load(""" ... !!python/object:__main__.Hero ... name: Welthyr Syxgon ... hp: 1200 ... sp: 0 ... """) Hero(name='Welthyr Syxgon', hp=1200, sp=0)
本地复现代码
将上述示例逻辑写入本地Python文件尝试运行,代码内容如下:
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) data = yaml.load(""" !!python/object:__main__.Hero name: Welthyr Syxgon hp: 1200 sp: 0 """)
运行报错信息
执行上述本地文件时,程序输出的提示与异常堆栈如下:
python objects1.py objects1.py:17: YAMLLoadWarning: calling yaml.load() without specifying a Loader parameter is deprecated, as the default Loader is unsafe. Please refer to PyYAML's official usage guidance for full details. """ Traceback (most recent call last): File "objects1.py", line 17, in <module> """ File "/home/user/miniconda3/envs/yamlPy2/lib/python2.7/site-packages/yaml/__init__.py", line 114, in load return loader.get_single_data() File "/home/user/miniconda3/envs/yamlPy2/lib/python2.7/site-packages/yaml/constructor.py", line 82, in get_single_data return self.construct_document(node) File "/home/user/miniconda3/envs/yamlPy2/lib/python2.7/site-packages/yaml/constructor.py", line 86, in construct_document data = self.construct_object(node) File "/home/user/miniconda3/envs/yamlPy2/lib/python2.7/site-packages/yaml/constructor.py", line 131, in construct_object data = constructor(self, node) File "/home/user/miniconda3/envs/yamlPy2/lib/python2.7/site-packages/yaml/constructor.py", line 458, in construct_undefined node.start_mark) yaml.constructor.ConstructorError: could not determine a constructor for the tag 'tag:yaml.org,2002:python/object:__main__.Hero' in "<string>", line 2, column 1: !!python/object:__main__.Hero ^
核心疑问
从报错信息判断,!!python/object对应的构造逻辑未被加载,请问这个官方示例缺少了什么必要的前置步骤?
内容的提问来源于stack exchange,提问作者KansaiRobot
相关产品推荐
相关产品推荐

