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

2023-12-06

大约5小时前,版本4.1.0被释放了。它破坏了我的单元测试。这是一个干净的 MVCE,显示了这一点:

3.12版本:

>>> 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:

>>> 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不再支持这些对象类型?


4.x 中的重大更改是尝试解决CVE-2017-18342,这是对不受信任的输入执行任意代码的可能性。

在 PyYAML 4.x 中,dump是一个别名safe_dump,它不会处理任意对象:

>>> yaml.dump is yaml.safe_dump
True

Use danger_dump对于旧的 3.x 行为。

>>> 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 的任何文档或发行说明,我只是通过挖掘提交才发现的(here).

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

Yes. yaml.load允许任意代码执行,这样一个危险的功能只能选择加入,不可能意外使用。按理说,从一开始就应该是这样的。


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

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 中的默认值:

>>> yaml.dump(sys)
"!!python/module:sys ''\n"
>>> yaml.dump(sys, Dumper=yaml.SafeDumper)
RepresenterError: ('cannot represent an object', <module 'sys' (built-in)>)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

新的 PyYAML 版本会破坏大多数自定义 python 对象 - RepresenterError 的相关文章

随机推荐

  • R CMD BATCH 或 Rscript 错误停止

    我不认为R CMD BATCH or Rscript应该在错误时停止 但我希望它停止 或类似的东西 作为一个例子 我有这个test R stop I really mean stop cat no I dont want this prin
  • 为 nth-child 和 nth-of-type 指定任意子级(无模式)列表

    所以我现在已经读了足够多的关于各种时髦的内容nth child and nth of type模式让第七个儿子的第七个儿子驾驶一艘宇宙飞船往返于冥王星 但我仍然没有找到一种方法来简单地以简洁的方式提供特定儿童的列表 它会像这样工作 td n
  • 判断SQLite数据库是否被锁定

    我读过关于如何检测 SQLite 数据库是否被锁定的其他答案 它建议使用sqlite3 busy handler sqlite3 busy timeout 我使用的是 Qt 它支持 SQLite 数据库 但这在这里并不重要 因为在我的应用程
  • MySQL注入查询

    我熟悉准备好的语句 并且我知道它们是防止 MySQL 注入的最佳实践 但我想知道这个 PHP MySQL 语句如何面临注入攻击的风险 result mysqli query db SELECT name FROM users WHERE i
  • Flash AS3 尝试获取外部 swf 时出现安全沙箱冲突

    嗨 我正在尝试从不同的服务器将 swf 文件加载到我的 Flash 应用程序 当我尝试将其加载到 flash IDE crl enter 上时 一切工作正常 但是当我将 swf 作为独立的 swf 文件运行或通过调试它时 我收到此错误 Se
  • 如何自定义像这样的按钮控件?

    我想制作一个像这样的自定义按钮控件 图像按钮可以 我是新用户 所以不能在这里发布图片 所以我上传了图片here 在尝试了一些教程后我现在有点绝望 任何建议都将受到高度赞赏 Thanks 更新于 08 10 2019 我很多年前就问过这个问题
  • 如何将xml元素绑定到对象成员变量中?

    我正在尝试使用 moxy 将 xml 解组为对象 下面是 xml 的示例
  • 创建有序计数器

    我一直在阅读如何super 作品 我碰到这个食谱演示了如何创建有序计数器 from collections import Counter OrderedDict class OrderedCounter Counter OrderedDic
  • 如何使用 C++ 代码中的 setsockopt() 调用更改 TCP 拥塞控制算法

    是否可以改变TCP拥塞控制算法 from Cubic to Reno或反之亦然使用套索克选择 call 来自 C 代码在Linux中 我正在寻找这样做的示例代码 您可以使用TCP CONGESTION用于获取或设置套接字的拥塞控制算法为下列
  • php检查数组值是否连续

    我有一个数组 dice 4 7 3 6 7 我需要一种方法来检查该数组中的每个值是否是连续的数字 有一个简单的方法可以做到这一点吗 尝试这个 dice array 4 5 2 6 7 function checkConsec d for i
  • 为什么在创建这个简单的物化视图示例时会出现 ORA-12054 错误?

    ALTER TABLE RECORDINGS ADD PRIMARY KEY ID CREATE MATERIALIZED VIEW LOG ON RECORDINGS TABLESPACE USERS NOLOGGING DROP MAT
  • R 中多个变量的 Shapiro-Wilk 正态性检验循环

    我有一个名为 My data 的数据集 以及三个名为 a b c 的变量 我的数据头是这样的 gt head My data variable A variable B value 1 Jul W1 18 780294 2 Jul W2 1
  • python3多进程共享numpy数组(只读)

    我不确定这个标题是否适合我的情况 我想分享 numpy array 的原因是它可能是我的情况的潜在解决方案之一 但如果您有其他解决方案也很好 我的任务 我需要实施一个迭代的算法与多重处理 而每个进程都需要有一份数据 这个数据很大 并且只读
  • 在MySQL中合并两个表之间的一列

    这是一个延续问题我上周问过 它涉及来自两个不同表的表列的组合 请考虑这个例子 我有一个包含这些值的表 vote orders a VOTE CANDIDATE RANKED CHOICE VOTES ORIGINAL VOTES 2 4 0
  • 泛型类型的模式匹配

    为什么我不能与 Node T 进行模式匹配 object Visitor def inorder T root Node T Unit root match case End gt return case Node T gt if root
  • CPack:从子目录(googletest 目录)中排除 INSTALL 命令

    我正在使用 CMake 进行项目 并使用 googletest 进行测试用例 环顾互联网 通常的做法是将 googletest 源代码复制到存储库的子文件夹中 并将其包含在 add subdirectory googletest 中 我就是
  • 文件 tesseract.exe 不存在

    我已经安装了pytesseract图书馆使用 pip install pytesseract 当我尝试使用image to text方法 它给了我一个 FileNotFoundError WinError 2 系统找不到指定的文件 我用谷歌
  • 在 Impala SQL 中编写 While 循环?

    在 Impala 中编写 while 循环的语法是什么 甚至可以写一个循环吗 我似乎无法声明变量 并且它不识别 while 作为关键字 因帕拉不支持WHILE在它的语法中循环 参考 Impala 保留字
  • React js onClick 无法将值传递给方法

    我想读取 onClick 事件值属性 但是当我点击它时 我在控制台上看到类似这样的内容 SyntheticMouseEvent dispatchConfig Object dispatchMarker 1 1 0 2 0 0 1 nativ
  • 新的 PyYAML 版本会破坏大多数自定义 python 对象 - RepresenterError

    大约5小时前 版本4 1 0被释放了 它破坏了我的单元测试 这是一个干净的 MVCE 显示了这一点 3 12版本 gt gt gt import numpy as np gt gt gt import yaml gt gt gt x np