ruamel压缩评论并注入0x07

时间:2018-11-25 13:34:14

标签: yaml ruamel.yaml

给出以下代码:

from ruamel.yaml import YAML

yaml = YAML()
with open(filename) as f:
    z = yaml.load(f)
yaml.dump(z, sys.stdout)

以及以下文件:

a: >
  Hello.<b>
  World.

<b>是空格字符(0x20)时,将产生以下YAML:

a: >
  Hello. <0x07> World.

<0x07>是字节0x07时。 尝试使用PyYAML重新加载此YAML会导致错误,因为0x07是无效字符。

当我在输入YAML中的Hello.之后删除尾随空白时,不会发生这种情况。

任何想法会导致这种情况吗?

1 个答案:

答案 0 :(得分:1)

在解析期间以块样式折叠字符串插入BEL字符(0x07\a),以便Python(ruamel.yaml.scalarstring.FoldedScalarString)中该标量的表示形式可以注册以下位置:原来的褶皱确实发生了。在转储时,执行相反的操作:将位置转换为BEL字符(如果它们对应于空格),然后将这些折叠位置从表示器传输到发射器,然后将其在原始点输出带有“折叠”的标量发生了。当然/只有在位置仍代表“可折叠”位置时,这种情况才会发生。

这里的问题是解析器在加载期间应该抱怨您的YAML不正确。这样做会失败,加载错误的数据,然后无法正确转储首先允许加载的混乱信息,从而导致BEL字符最终出现在输出中。

YAML specification指出:

  

折叠允许在单个空格字符将两个非空格字符分开的任何地方断开长行。

由于您的行没有在两个非空格字符之间折叠,因此,如果不是立即解析器错误,这将导致警告。¹

此外,如果表示者要替换的空格与空白相邻,那么它当然应该足够聪明,不要用BEL字符替换空格。用折叠的字符串更改从正确的YAML加载的字符串后,也会发生这种情况。我基本上认为是一个错误。

ruamel.yaml> 0.15.80修复了错误表示形式。有关错误/加载警告的实现可能很快就会实现。


¹仅发出警告时,我的最初反应是,我应该清除有问题的尾随空间,以防万一有更多的空间(因为它不可见)并保持折叠。