4

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 ファイルの最初のカットを次に示します。

こんにちは.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.11した場合の両方で発生しPyYAML=3.11ます。

私が理解しているように、YAML 仕様ではそれらの間に機能的な違いがないのに、これらの Python YAML パーサーで一重引用符と二重引用符に違いがあるのはなぜですか? 特殊文字がエスケープされないようにするにはどうすればよいですか?

4

1 に答える 1

6

一重引用符と二重引用符で囲まれた文字列の YAML 仕様には大きな違いがあります。一重引用符で囲まれたスカラー内では、一重引用符のみをエスケープできます。

単一引用符で囲まれたスタイルは、周囲の「'」インジケータで指定されます。したがって、単一引用符で囲まれたスカラー内では、そのような文字を繰り返す必要があります。これは、単一引用符で囲まれたスカラーで実行される唯一のエスケープ形式です。

したがって\、 in 'hello\t'には特別な機能はなく、そのスカラーは文字hel(2x) で構成されoます。\t

バックスラッシュのエスケープは、二重引用符で囲まれた YAML スカラーでのみサポートされています。

于 2016-07-05T12:42:13.873 に答える