代码之家  ›  专栏  ›  技术社区  ›  Isaac

ruamel冷凝注释和注入0x07

  •  3
  • Isaac  · 技术社区  · 7 年前

    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 . 0x07 是无效字符。

    当我在 Hello. 在输入YAML中。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Anthon    7 年前

    贝尔角色( 0x07 , \a )在解析期间插入块样式折叠字符串,以便在Python中表示该标量( ruamel.yaml.scalarstring.FoldedScalarString )可以记录原始折叠发生的位置。在转储时,会执行相反的操作:位置被转换为BEL字符(如果它们对应于空格),因此将这些折叠位置从重新输入传输到发射器,发射器随后在发生的原始点处输出带有“折叠”的标量。当然,只有当这些位置仍然代表“可折叠”位置时,才会发生这种情况。

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

    YAML specification 国家:

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

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

    ruamel.yaml>0.15.80已修复错误表示。加载时的错误/警告很可能很快就会实现。


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