为什么PyYAML和ruamel.yaml在单引号时转义特殊字符?

时间:2016-07-05 12:26:45

标签: python-3.x escaping yaml pyyaml ruamel.yaml

我有一个YAML文件,并希望约束某个字段不包含空格。

这是一个演示我尝试的脚本:

  

test.py

localStorage.getItem("lastname");

这是我对YAML文件的第一次剪切:

  

hello.yaml

#!/usr/bin/env python3

import os
from ruamel import yaml

def read_conf(path_to_config):
    if os.path.exists(path_to_config):
        conf = open(path_to_config).read()
        return yaml.load(conf)
    return None

if __name__ == "__main__":
    settings = read_conf("hello.yaml")
    print("type of name: {0}, repr of name: {1}".format(type(
             settings['foo']['name']), repr(settings['foo']['name'])))
    if any(c.isspace() for c in settings['foo']['name']):
        raise Exception("No whitespace allowed in name!")

在上面的YAML文件中,正确引发了异常:

foo:
    name: "hello\t"

但是,如果我将双引号更改为单引号,则不会引发异常:

type of name: <class 'str'>, repr of name: 'hello\t'
Traceback (most recent call last):
  File "./test.py", line 16, in <module>
    raise Exception("No whitespace allowed in name!")
Exception: No whitespace allowed in name!

使用08:23 $ ./test.py type of name: <class 'str'>, repr of name: 'hello\\t' ruamel.yaml==0.11.11时会出现此问题。

为什么这些Python YAML解析器中的单引号和双引号之间存在差异,据我所知,在YAML规范中它们之间没有功能差异?如何防止特殊字符被转义?

1 个答案:

答案 0 :(得分:4)

单引号和双引号字符串之间的YAML规范存在巨大差异。在single quoted scalars内你只能逃避单引号:

  

单引号样式由周围的“'”指示符指定。因此,在单引号标量中,需要重复这样的字符。这是在单引号标量中执行转义的唯一形式。

因此\中的'hello\t'没有特殊功能,标量包含字母hel(2x),{{1 }}。 o\

反斜杠转义仅在双引号YAML标量中受支持。