【问题标题】:ruamel condensing comments and injecting 0x07ruamel 压缩评论并注入 0x07
【发布时间】:2019-04-27 07:47:18
【问题描述】:

给定以下代码:

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.

&lt;b&gt; 是空格字符 (0x20) 时,生成以下 YAML:

a: >
  Hello. <0x07> World.

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

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

知道是什么原因造成的吗?

【问题讨论】:

  • 您可能安装了有问题的 ruamel 版本。我遇到了同样的问题,它在 0.15.66 版中得到了修复:pypi.org/project/ruamel.yaml/0.15.66 请参阅更新日志中的评论
  • @tinita 我正在使用0.15.79,AFAIK 是最新的。此外,我也可以使用 0.15.66 重现此内容。

标签: yaml ruamel.yaml


【解决方案1】:

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

这里的问题是解析器应该在加载过程中抱怨你的 YAML 不正确。它没有这样做,加载了错误的数据,然后无法正确转储它允许加载的混乱,导致 BEL 字符最终出现在输出中。

YAML specification 声明:

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

并且由于您的行没有在两个非空格字符之间折叠,如果不是立即出现解析器错误,这应该会导致警告。¹

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

ruamel.yaml>0.15.80 修复了不正确的表示。加载错误/警告的实现可能很快就会出现。


¹ 当只发出警告时,我最初的反应是我应该去掉错误的尾随空格,或者空格以防有更多,因为它是不可见的,并保持折叠。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    • 2023-03-19
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    • 2011-03-07
    相关资源
    最近更新 更多