ruamel.yaml:关于typ和pure=True的澄清

Dmi*_*gol 5 python yaml ruamel.yaml

我试图理解Python 库中typ和 的含义。我已阅读此处的 文档。 到目前为止,我已经了解使用安全加载器,该加载器省略了 YAML 中的 YAML 标记解析(它们可能导致任意代码执行)。我在文档中 没有找到有关往返解析器的任何解释。pure=Trueruamel.yaml

typ='safe'
typ='rt'

另外,我认为解释pure=True很混乱:

提供pure=True强制使用纯 Python 实现(如果可能/可用,将使用更快的 C 库)

是否使用更快的 C 库pure=True?如果确实如此,为什么您需要首先指定此标志?

Ant*_*hon 10

标准参数有四个typ

  • rt:(对于往返)在这种情况下,文档以保留注释等的特殊类型加载,用于转储。这是ruamel.yaml创建的目的,也是默认值(即,如果您不指定,您将得到什么typ)。这是加载器/转储器的子类safe
  • safe:这仅加载/转储标记对象,当这些对象显式注册到加载器/转储器时
  • unsafe:尝试加载/转储所有内容。类会自动解析为表单的标签!!python/object:<module>/<class>
  • base:一切都源自装载机/卸载机。所有标量都作为字符串加载(甚至像 YAML 规范或类型描述中提到的那样进行特殊处理的整数、浮点数、布尔值等类型)

对于safe, unsafebase有更快的 C Loader 可用。如果您从.tar.gz文件安装,则仅当适当的编译器可用时,这些文件才会在安装过程中进行编译。如果它们不可,因为它们无法编译,那么它们就不能使用。
没有 C 版本的rt代码。所以不可能使用C库。

该词pure适用于仅使用 Python 模块的情况。相反的情况就是“被污染”:Python 被 C 扩展模块污染。没有tainted=True参数。pure=true当未指定时,这是隐式的(如果可能/可用,请参阅上一段) ,因为默认pure值为False


为了进一步迷惑您:以上是 的四个基本(内置)值type。如果您使用插件,您可以这样做

yaml = YAML(typ='jinja2')
Run Code Online (Sandbox Code Playgroud)

这个答案所示


上述一些信息可以从YAML()docstring中获得,但其中很少有进入到包文档中,这主要是由于ruamel.yaml作者的懒惰造成的。

  • 使用您想要测试的 Python 版本(即您的 virtualenv)运行以下命令: `/path/to/python -c "import ruamel.yaml; print(ruamel.yaml.__with_libyaml__)"` (我假设您不这样做一定要自己去寻找共享对象)。是的,为了获得最佳性能,“YAML(typ='safe')”与“YAML(typ='safe', pure=False)”相同 (2认同)