yaml.load和yaml.safe_load之间的Python区别

问题描述

我看到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.safe_load(sys.stdin)只是yaml.load(sys.stdin,Loader=yaml.SafeLoader)

用于执行任意Python代码(使加载不安全)的工具在默认情况下使用的yaml.Loader中实现。 yaml.BaseLoader不包含它们。因此,如果您使用yaml.BaseLoader,则加载将不会执行任意Python代码(也就是说,除非您自己向yaml.BaseLoader注册自定义构造函数)。