具有多个文件的 YAML 1.2 指令在不安全模式下不起作用
YAML 1.2 directive with multiple files doesn't work in unsafe mode
我正在尝试加载如下所示的多文件 yaml 配置文件:
文件:
%YAML 1.2
---
num_epochs: 1
---
num_epochs: 1
并且 python 脚本是:
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)
虽然这并没有给出上面的错误
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
派生自 PyYAML
,它本身依赖于 libyaml
,用于基于 C 的快速加载和转储。 PyYAML
和 libyaml
都是由 Kirill Simonov 开发的。虽然有一些 1.2 的东西 PyYAML
和 libyaml
支持(例如尾数中没有小数点的浮点数),但这两个 "only" 实现了 YAML 1.1 的大部分。
最初 ruamel.yaml
链接到 libyaml
以提供快速,但自从一段时间以来它有自己的源副本,这使得创建轮子更容易 (.whl
)特别是 Python 的 Windows 版本。
ruamel.yaml
当前 (0.15.33) 版本中包含的 C 源代码与 libyaml
中的代码基本没有变化。这就是为什么往返解析器没有等效的 C/non-pure 版本的原因,也是为什么 safe/unsafe/base-loader 的纯版本接受 YAML 1.2 而非纯(基于 C 的)版本不接受的原因。
当然,这至少应该适当地记录下来,但最好应该调整 C 代码以支持往返。在大修用于往返的 C 代码的同时,它还将进行调整以支持 YAML 1.2 以进行 safe/unsafe/base 加载。
在 ruamel.yaml 0.15.62 中,C reader/parser 接受 %YAML 1.2
并且发射器允许使用该指令进行转储。
没有更改实际代码,因此 reader 仍然解析 YAML 1.1 unicode 换行符和八进制等。转储问题应该较少(例如,基于 C 的转储器从不转储八进制)。
(参考 test_cyaml.py
中的 test_load_cyaml_1_2()
和 test_dump_cyaml_1_2()
测试)
我正在尝试加载如下所示的多文件 yaml 配置文件:
文件:
%YAML 1.2
---
num_epochs: 1
---
num_epochs: 1
并且 python 脚本是:
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)
虽然这并没有给出上面的错误
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
派生自 PyYAML
,它本身依赖于 libyaml
,用于基于 C 的快速加载和转储。 PyYAML
和 libyaml
都是由 Kirill Simonov 开发的。虽然有一些 1.2 的东西 PyYAML
和 libyaml
支持(例如尾数中没有小数点的浮点数),但这两个 "only" 实现了 YAML 1.1 的大部分。
最初 ruamel.yaml
链接到 libyaml
以提供快速,但自从一段时间以来它有自己的源副本,这使得创建轮子更容易 (.whl
)特别是 Python 的 Windows 版本。
ruamel.yaml
当前 (0.15.33) 版本中包含的 C 源代码与 libyaml
中的代码基本没有变化。这就是为什么往返解析器没有等效的 C/non-pure 版本的原因,也是为什么 safe/unsafe/base-loader 的纯版本接受 YAML 1.2 而非纯(基于 C 的)版本不接受的原因。
当然,这至少应该适当地记录下来,但最好应该调整 C 代码以支持往返。在大修用于往返的 C 代码的同时,它还将进行调整以支持 YAML 1.2 以进行 safe/unsafe/base 加载。
在 ruamel.yaml 0.15.62 中,C reader/parser 接受 %YAML 1.2
并且发射器允许使用该指令进行转储。
没有更改实际代码,因此 reader 仍然解析 YAML 1.1 unicode 换行符和八进制等。转储问题应该较少(例如,基于 C 的转储器从不转储八进制)。
(参考 test_cyaml.py
中的 test_load_cyaml_1_2()
和 test_dump_cyaml_1_2()
测试)