loader参数在yaml.load()函数中的作用是什么?

loader参数在yaml.load()函数中的作用是什么?,yaml,pyyaml,Yaml,Pyyaml,我正在写一个代码来读取YAML文件作为输入。我在yaml.load调用中看到以下选项作为Loader:BaseLoader,SafeLoader,FullLoader,UnsafeLoader 这些选项有什么作用?如以下文档页面所述,加载完整的YAML语言意味着什么 在PyYAML中,调用以加载YAML的接口是一个基于函数的函数(加载函数) 将YAML文件中的文本转换为Python对象、扫描、解析、合成和构造的不同阶段的实现都是作为类实现的,PyYAML使用合成将这些类组合到加载程序中 有不同的

我正在写一个代码来读取YAML文件作为输入。我在
yaml.load
调用中看到以下选项作为
Loader
BaseLoader
SafeLoader
FullLoader
UnsafeLoader

这些选项有什么作用?如以下文档页面所述,加载完整的YAML语言意味着什么


在PyYAML中,调用以加载YAML的接口是一个基于函数的函数(加载
函数)

将YAML文件中的文本转换为Python对象、扫描、解析、合成和构造的不同阶段的实现都是作为类实现的,PyYAML使用合成将这些类组合到加载程序中

有不同的加载程序,主要是因为有不同的构造函数。例如,安全版本的加载器将使用安全构造函数,它不会创建任意Python对象,基础加载器只加载字符串(而不是整数、浮点、布尔、日期)等

在PyYAML中,您不创建要使用的特定加载程序的实例,然后调用其方法之一(或将参数传递给初始化)。而是将要创建的对象类型(即其类)作为
Loader
参数传递给
load()
函数。还有一些实用程序函数,如
unsafe_load()
,基本上为您执行
load(…,Loader=BaseLoader,…)


请注意,正因为如此,从加载过程中很难获得任何值,除了构建的实际数据(假设您对扫描器丢弃的注释数量感兴趣):很容易对扫描器进行子类化并添加功能,但是您需要制作一个替代的加载器,该加载器与此扫描器组合在一起,然后在
load(…,loader=YourLoader)
调用结束时,您的
YourLoader
消失了,因此您无法访问添加到扫描器(或解析器、编写器、构造函数)实例中的任何属性来存储信息

上面描述的是纯Python版本,基于C的加载程序对于扫描器/解析器的工作原理略有不同