gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:05:52 27 4
gpt4 key购买 nike

我有一个 YAML 文件,希望限制某个字段不包含空格。

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

test.py

#!/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 文件的第一个剪切:

hello.yaml

foo:
name: "hello\t"

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

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.11PyYAML=3.11 时都会出现此行为。

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

最佳答案

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

The single-quoted style is specified by surrounding “'” indicators. Therefore, within a single-quoted scalar, such characters need to be repeated. This is the only form of escaping performed in single-quoted scalars.

因此 'hello\t' 中的 \ 没有特殊功能,该标量由字母 he< 组成l (2x)、o\t

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

关于python-3.x - 为什么 PyYAML 和 ruamel.yaml 在单引号时转义特殊字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38203445/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com