StrictYAML

GitHub Repo stars PyPI - Downloads

StrictYAML 是一个类型安全的 YAML 解析器,它解析并验证 YAML 规范的一个受限子集

主要特性:

简单示例:

# All about the character
name:Ford Prefect
age:42
possessions:
-Towel
from strictyaml import load, Map, Str, Int, Seq, YAMLError

默认解析结果:

>>> load(yaml_snippet)
YAML({'name': 'Ford Prefect', 'age': '42', 'possessions': ['Towel']})

所有数据都是字符串、列表或 OrderedDict 类型:

>>> load(yaml_snippet).data
{'name': 'Ford Prefect', 'age': '42', 'possessions': ['Towel']}

使用 schema 的快速入门:

from strictyaml import load, Map, Str, Int, Seq, YAMLError
schema = Map({"name": Str(), "age": Int(), "possessions": Seq(Str())})

42 现在被解析为整数:

>>> person = load(yaml_snippet, schema)
>>> person.data
{'name': 'Ford Prefect', 'age': 42, 'possessions': ['Towel']}

如果存在语法问题、违反 schema 或使用了不允许的 YAML 特性,将会抛出 YAMLError 异常:

# All about the character
name:Ford Prefect
age:42

例如,一个 schema 违例:

try:
  person = load(yaml_snippet, schema)
except YAMLError as error:
  print(error)
while parsing a mapping
in "<unicode string>", line 1, column 1:
# All about the character
^ (line:1)
required key(s) 'possessions' not found
in "<unicode string>", line 3, column 1:
age:'42'
^ (line:3)

如果解析正确:

from strictyaml import load, Map, Str, Int, Seq, YAMLError, as_document
schema = Map({"name": Str(), "age": Int(), "possessions": Seq(Str())})

您可以修改值并写出 YAML,同时保留注释:

person = load(yaml_snippet, schema)
person['age'] = 43
print(person.as_yaml())
# All about the character
name:Ford Prefect
age:43
possessions:
-Towel

以及查找行号:

>>> person = load(yaml_snippet, schema)
>>> person['possessions'][0].start_line
5

还可以从 dict 或 list 构建 YAML 文档:

print(as_document({"x": 1}).as_yaml())
x:1

安装

$ pip install strictyaml

为什么选择 StrictYAML?

有许多格式和方法可以实现与 StrictYAML 大致相同的目的。 我已尝试使其成为最好的一个。 以下是一系列有据可查的理由:

使用 StrictYAML

使用方法:

复合验证器:

标量验证器:

限制:

设计依据

StrictYAML 中有一些有争议和/或不明显的设计决策。 这些记录在此处:

Star 贡献者

其他贡献者

StrictYAML 还包含来自 ruamel.yaml 的代码,版权所有 Anthon van der Neut。

贡献

Copyright © 2018 - 2023 Colm O'Connor

Material for MkDocs 构建。