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

What does the loader parameter does in yaml.load() function?

我正在编写代码来读取 YAML 文件作为输入。我在 yaml.load 调用中看到以下选项为 LoaderBaseLoaderSafeLoaderFullLoaderUnsafeLoader.

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

https://github.com/yaml/pyyaml/wiki/PyYAML-yaml.load(input)-Deprecation

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

将 YAML 文件中的文本转换为 Python 对象的不同阶段的实现,扫描解析composingconstructing 实现为 classes,PyYAML 使用组合将其组合成 loader .

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

在 PyYAML 中不要创建您要使用的特定加载器的实例,然后调用它的方法之一(或将参数传递给初始化)。相反,您将要创建的对象类型(即它的 class)作为 Loader 参数传递给 load() 函数。还有一些实用函数,例如 unsafe_load(),本质上是为您做 load(..., Loader=BaseLoader,...) 等。


请注意,因此,很难从加载过程中获取任何值,除了构建的实际数据(假设您对扫描器丢弃的评论数感兴趣):它很容易将 class 扫描器子化并添加功能,但是您需要制作一个替代加载器,该加载器将自身与该扫描器组合在一起,然后在 load(..., Loader=YourLoader) 调用结束时 YourLoader 消失了,因此您无法获取添加到扫描器(或解析器、组合器、构造器)实例的任何属性来存储信息。

以上描述的是纯 Python 版本,基于 C 的加载器在 scanner/parser.

中的工作方式略有不同