【问题标题】:Python difference between yaml.load and yaml.safe_loadyaml.load 和 yaml.safe_load 之间的 Python 区别
【发布时间】:2021-01-02 18:53:39
【问题描述】:

我看到 PyYaml 在从 yaml 文件加载时截断零,如果有人使用: yaml.safe_load(stream).

如果有人使用yaml.load(stream, Loader=yaml.BaseLoader),它可以修复,但这是否可取?

它适用于yaml.load,并且零不会被截断。

我想了解切换到 yaml.load 而不是 yaml.safe_load 是否安全?

例子:

测试yaml内容:

$cat test.yml
number: 5.10

代码:

$python -c 'import yaml, sys; content = yaml.safe_load(sys.stdin); 
print(content) ' < test.yml
{'number': 5.1}

>

而我想要的是确切的数字。

$python -c 'import yaml, sys; content = yaml.load(sys.stdin, 
Loader=yaml.BaseLoader); print(content) ' < test.yml
{u'number': u'5.10'}

这是将其更改为 yaml.load 的正确方法吗?

【问题讨论】:

  • 你能举一个例子来说明你截断零的意思吗?
  • 我不知道这是否有很大帮助。您添加的只是一些数字,但这并不能澄清任何事情。 YAML 文件中的数字是如何表示的?您究竟使用什么代码来加载文件,以及您使用什么代码来发现零被截断?它的输出是什么?可能stackoverflow.com/help/minimal-reproducible-example 中列出的很多内容都可以在这里添加。
  • 这并不是一个完整的例子,但让我试着澄清一下。您的投诉是 yaml.safe_load("5.10") 返回 5.1 吗?如果是这样,您的问题不是它“截断零”,而是它将它解析为浮点数。确切的解决方案可能取决于您要做什么,您能否提供有关您的用例的更多信息?

标签: python python-3.x yaml pyyaml


【解决方案1】:

yaml.safe_load(sys.stdin) 只是 yaml.load(sys.stdin, Loader=yaml.SafeLoader)

在默认使用的yaml.Loader 中实现了执行任意 Python 代码(这使得加载不安全)的设施。 yaml.BaseLoader 不包含它们。因此,如果你使用yaml.BaseLoader,加载将不会执行任意Python代码(也就是说,除非你自己用yaml.BaseLoader注册了自定义构造函数)。

【讨论】:

  • 感谢@flyx,当我加载 yaml 文件时,我仍然无法弄清楚如何在浮点数中保留尾随零。有什么建议吗?
  • 您可以执行以下两项操作之一:将值加载为IEEE 754 floating point number(浮点的标准表示),这将丢失零,因为它不会更改值。或者将值加载为字符串,这是您在使用BaseLoader 时所做的。然后它是一个字符串,你不能用它做算术,但它保留了它的表示。你已经展示了做每件事的代码,所以你知道怎么做,还有什么不清楚?
猜你喜欢
  • 2021-06-10
  • 2016-03-26
  • 2011-03-24
  • 2014-01-03
  • 2019-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多