具有多个文件的YAML 1.2指令不能在不安全模式下工作

时间:2017-09-06 02:16:59

标签: ruamel.yaml

我尝试加载多文件yaml配置文件,如下所示:

文件:

$('html,body').animate({scrollTop: 0}, 'slow');

并且python脚本是:

%YAML 1.2
---
num_epochs: 1
---
num_epochs: 1

执行时,会出现以下错误:

from ruamel.yaml import YAML

yaml = YAML(typ='unsafe')
configs = yaml.load_all(Path(Experiment.config_file))
for config in configs:
    print(config)

如果我使用ruamel.yaml.parser.ParserError: found incompatible YAML document in "../MAML_tensorflow/experiment.yml", line 1, column 1 直接从模块导入,该文件可以正常工作。这是预期的行为吗?

这可能是一个错误,因为将实现标志设置为load_all会得到正确的解析结果。

pure

虽然没有并且给出上面的错误

from ruamel.yaml import YAML

yaml = YAML(typ='unsafe', pure=True)
configs = yaml.load_all(Path(Experiment.config_file))
for config in configs:
print(config)

1 个答案:

答案 0 :(得分:1)

这是唉,预期的行为。 ruamel.yaml源自PyYAML,它本身依赖于libyaml,用于快速基于C的加载和转储。 PyYAMLlibyaml都由Kirill Simonov开发。虽然有一些1.2 PyYAMLlibyaml支持(例如尾数中没有小数点的浮点数),但这两个“仅”实现了YAML 1.1的大部分内容。

最初ruamel.yamllibyaml相关联以提供快速,但有一段时间它有自己的源副本,这使得创建轮子(.whl)更容易Windows版的Python。

ruamel.yaml的当前(0.15.33)版本中包含的C源与libyaml中的代码大致相同。这就是为什么往返解析器没有等效的C /非纯版本的原因,以及为什么纯版本的safe / unsafe / base-loader接受YAML 1.2和非纯(基于C)的版本呢?不

当然这至少应该适当记录,但最好是C代码应该适应支持往返。在对C代码进行全面检修时,它也将适用于支持YAML 1.2进行安全/不安全/基本加载。

在ruamel.yaml 0.15.62中,C读取器/解析器接受%YAML 1.2,并且发射器允许使用该指令进行转储。

没有更改实际代码,因此读者仍然会解析YAML 1.1 unicode换行符和八进制等。转储应该不那么成问题(例如,基于C的转储器从不转储八进制)。

(参考test_cyaml.py中的test_load_cyaml_1_2()test_dump_cyaml_1_2()测试)