严格的类型化YAML解析器
项目描述
StrictYAML
StrictYAML是一个类型安全的YAML解析器,它解析并验证YAML规范的一个受限子集。
优先级
- 美丽的API
- 拒绝解析YAML中丑陋、难以阅读和不安全的特性,如挪威问题。
- 对标记进行严格的验证和简单的类型转换。
- 具有代码片段和行号的清晰、可读的异常。
- 可以作为pyyaml、ruamel.yaml或poyo的近似替代品。
- 能够读取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相似的目的。我已经尽力使其成为最好的一个。以下是一系列文档化的理由
- 为什么避免使用环境变量作为配置?
- 为什么不使用HJSON?
- 为什么不使用HOCON?
- 为什么不使用INI文件?
- 为什么不使用JSON Schema进行验证?
- 为什么不使用JSON作为简单的配置文件?
- 为什么不使用JSON5?
- 为什么不使用YAML 1.2标准?——我们不需要新的标准!
- 为什么不使用kwalify与标准YAML来验证我的YAML?
- 为什么不使用Python的schema库(或类似库)进行验证?
- 为什么不使用SDLang?
- TOML有什么问题?
- 为什么我不能只使用Python代码进行配置?
- 为什么不使用XML进行配置或DSLs?
使用StrictYAML
如何
- 在代码中从头开始构建YAML文档
- 不同、同等有效的不同类型的YAML的either/or模式验证
- 标记异常
- 合并YAML文档
- 重新验证已验证的文档
- 读取YAML、编辑它并重新写入
- 获取YAML元素的行号
- 没有模式解析YAML
复合验证器
- 固定长度的序列(FixedSeq)
- 包含已定义和未定义键的映射(MapCombined)
- 具有任意键名的映射(MapPattern)
- 具有定义键和自定义键验证器的映射(Map)
- 使用解析映射的YAML对象
- 具有定义键的映射(Map)
- 具有默认值的可选键(Map/Optional)
- 验证映射中的可选键(Map)
- 唯一项的序列(UniqueSeq)
- 序列/列表验证器(Seq)
- 使用模式更新文档
标量验证器
- 布尔值(Bool)
- 解析逗号分隔的项目(CommaSeparated)
- 日期时间(Datetime)
- 十进制数字(Decimal)
- 电子邮件和URL验证器
- 空键验证
- 枚举标量(Enum)
- 浮点数(Float)
- 十六进制整数(HexInt)
- 整数(Int)
- 使用正则表达式验证字符串(Regex)
- 解析字符串(Str)
限制
设计理由
StrictYAML中的一些设计决策是有争议的,或者不是很明显。这些将在下面进行说明
- 重复键有什么问题?
- 显式标签有什么问题?
- flow-style YAML有什么问题?
- 挪威问题——为什么StrictYAML拒绝进行隐式类型化,你也应该这样做
- 节点锚点和引用有什么问题?
- 为什么StrictYAML不解析Python对象的直接表示?
- 为什么StrictYAML只从字符串解析,而不从文件解析?
- 为什么解析速度不是StrictYAML的优先任务?
- 什么是语法类型?
- 为什么StrictYAML让你在Python——一种图灵完备语言中定义一个模式?
Star贡献者
- @wwoods
- @chrisburr
- @jnichols0
其他贡献者
- @eulores
- @WaltWoods
- @ChristopherGS
- @gvx
- @AlexandreDecan
- @lots0logs
- @tobbez
- @jaredsampson
- @BoboTIG
StrictYAML还包括来自ruamel.yaml的代码,版权属于Anthon van der Neut。
贡献
- 在编写任何代码之前,请阅读有关向hitchdev库贡献的教程。
- 在编写任何代码之前,如果您正在提议一个新功能,请将其在github上提出。如果是现有功能/错误,请评论并简要描述您将如何实现它。
- 所有代码都需要附带一个使用它的故事或修改现有故事。这既用于测试代码,也用于构建文档。
项目详情
下载文件
下载您平台上的文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。
源代码分发
strictyaml-1.7.3.tar.gz (115.2 kB 查看哈希值)
构建分发
strictyaml-1.7.3-py3-none-any.whl (123.9 kB 查看哈希值)
关闭
strictyaml-1.7.3.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 22f854a5fcab42b5ddba8030a0e4be51ca89af0267961c8d6cfa86395586c407 |
|
MD5 | 737feac544fad8787827ce89fb628170 |
|
BLAKE2b-256 | b308efd28d49162ce89c2ad61a88bd80e11fb77bc9f6c145402589112d38f8af |
关闭
strictyaml-1.7.3-py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | fb5c8a4edb43bebb765959e420f9b3978d7f1af88c80606c03fb420888f5d1c7 |
|
MD5 | 29b59dceb396b2f7cdc36aabe55e85e5 |
|
BLAKE2b-256 | 967ca81ef5ef10978dd073a854e0fa93b5d8021d0594b639cc8f6453c3c78a1d |