跳至内容

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']}

使用模式的快速入门

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']}

如果存在语法问题、违反模式或使用不允许的 YAML 功能,将引发 YAMLError

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

例如,模式违规

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

并从字典或列表构建 YAML 文档

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

安装

$ pip install strictyaml

为什么使用 StrictYAML?

有许多格式和方法可以实现与 StrictYAML 类似的目的。我尝试使其成为最佳方法。下面是一系列经过记录的理由

使用 StrictYAML

如何

复合验证器

标量验证器

限制

设计理由

StrictYAML 中有一些设计决策存在争议或不明显。这些都在这里有记录

明星贡献者

  • @wwoods
  • @chrisburr
  • @jnichols0

其他贡献者

  • @eulores
  • @WaltWoods
  • @ChristopherGS
  • @gvx
  • @AlexandreDecan
  • @lots0logs
  • @tobbez
  • @jaredsampson
  • @BoboTIG

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

贡献

  • 在编写任何代码之前,请阅读有关 向 hitchdev 库贡献代码 的教程。
  • 在编写任何代码之前,如果你正在提议一个新功能,请在 github 上提出。如果这是一个现有的功能/错误,请评论并简要描述你将如何实现它。
  • 所有代码都需要附带一个故事,来测试它或修改现有故事。这既用于测试代码,也用于构建文档。