首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >新的PyYAML版本破坏了大多数自定义python对象- RepresenterError

新的PyYAML版本破坏了大多数自定义python对象- RepresenterError
EN

Stack Overflow用户
提问于 2018-06-27 02:55:30
回答 1查看 2.1K关注 0票数 4

大约5个小时前,4.1.0版本发布了。它破坏了我的单元测试。下面是一个干净的MVCE,显示如下:

版本3.12:

代码语言:javascript
运行
复制
>>> import numpy as np
>>> import yaml
>>> x = np.int64(2)
>>> yaml.dump(x, Dumper=yaml.Dumper)
'!!python/object/apply:numpy.core.multiarray.scalar\n- !!python/object/apply:numpy.dtype\n  args: [i8, 0, 1]\n  state: !!python/tuple [3, <, null, null, null, -1, -1, 0]\n- !!binary |\n  AgAAAAAAAAA=\n'

版本4.1.0

代码语言:javascript
运行
复制
>>> import numpy as np
>>> import yaml
>>> x = np.int64(2)
>>> yaml.dump(x, Dumper=yaml.Dumper)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/foo/anaconda3/envs/bar/lib/python3.6/site-packages/yaml/__init__.py", line 217, in dump
    return dump_all([data], stream, Dumper=Dumper, **kwds)
  File "/foo/anaconda3/envs/bar/lib/python3.6/site-packages/yaml/__init__.py", line 196, in dump_all
    dumper.represent(data)
  File "/foo/anaconda3/envs/bar/lib/python3.6/site-packages/yaml/representer.py", line 26, in represent
    node = self.represent_data(data)
  File "/foo/anaconda3/envs/bar/lib/python3.6/site-packages/yaml/representer.py", line 57, in represent_data
    node = self.yaml_representers[None](self, data)
  File "/foo/anaconda3/envs/bar/lib/python3.6/site-packages/yaml/representer.py", line 229, in represent_undefined
    raise RepresenterError("cannot represent an object", data)
yaml.representer.RepresenterError: ('cannot represent an object', 2)

为什么PyYAML不再支持这些对象类型有明确的原因吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-27 03:47:32

在PyYAML 4.x中,dumpsafe_dump的别名,它不会处理任意对象:

代码语言:javascript
运行
复制
>>> yaml.dump is yaml.safe_dump
True

对旧的3.x行为使用danger_dump

代码语言:javascript
运行
复制
>>> yaml.danger_dump(x)
'!!python/object/apply:numpy.core.multiarray.scalar\n- !!python/object/apply:numpy.dtype\n  args: [i8, 0, 1]\n  state: !!python/tuple [3, <, null, null, null, -1, -1, 0]\n- !!binary |\n  AgAAAAAAAAA=\n'

load/safe_load也是如此。无法为4.1.0找到任何文档或发行说明,我只通过挖掘提交(这里)才能找到。

为什么PyYAML不再支持这些对象类型有明确的原因吗?

是。yaml.load允许任意的代码执行,这样一个危险的特性应该被选择--仅限于,不可能意外地使用。可以说,从一开始就应该是这样的。

在当前的PyYAML 5.x中,可以指定加载程序/dumper类作为参数,而不是使用不同的函数:

代码语言:javascript
运行
复制
yaml.dump(x, Dumper=yaml.Dumper)      # like "danger dump"
yaml.dump(x, Dumper=yaml.SafeDumper)  # like "safe_dump", won't dump python objs

与3.x一样,“危险”转储在5.x中仍然是默认的:

代码语言:javascript
运行
复制
>>> yaml.dump(sys)
"!!python/module:sys ''\n"
>>> yaml.dump(sys, Dumper=yaml.SafeDumper)
RepresenterError: ('cannot represent an object', <module 'sys' (built-in)>)
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51053903

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档