strictyaml
strictyaml是一种类型的YAML解析器,可以解析和验证YAML规范的受限子集。
优先事项:
- 美丽的API
- 拒绝解析像挪威问题一样的丑陋,难以阅读和不安全的特征。
- 严格验证标记和直截了当的铸造。
- 清晰,可读的异常,带有代码片段和行号。
- 充当替换Pyyaml,Ruamel.yaml或Poyo的近滴。
- 能够在YAML中阅读,进行更改并再次写出评论。
- 目前没有速度。
简单示例:
# All about the character name : Ford Prefect age : 42 possessions : - Towel
strictyaml import load, Map, Str, Int, Seq, YAMLError
\”>
from strictyaml import load , Map , Str , Int , Seq , YAMLError
默认分析结果:
> >> load ( yaml_snippet ) YAML ({ \'name\' : \'Ford Prefect\' , \'age\' : \'42\' , \'possessions\' : [ \'Towel\' ]})
所有数据都是字符串,列表或订购:
> >> load ( yaml_snippet ). data { \'name\' : \'Ford Prefect\' , \'age\' : \'42\' , \'possessions\' : [ \'Towel\' ]}
QuickStart with Schema:
strictyaml import load, Map, Str, Int, Seq, YAMLError
schema = Map({"name": Str(), "age": Int(), "possessions": Seq(Str())})
\”>
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)
如果正确解析:
strictyaml import load, Map, Str, Int, Seq, YAMLError, as_document
schema = Map({"name": Str(), "age": Int(), "possessions": Seq(Str())})
\”>
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
并从DICS或列表中构造YAML文档:
print ( as_document ({ \"x\" : 1 }). as_yaml ())
x : 1
安装
$ pip install strictyaml
为什么要strictyaml ?
有许多格式和方法可以实现与strictyaml或多或少相同的目的。我试图使它成为最好的。以下是一系列有记录的理由:
- 为什么要避免使用环境变量作为配置?
- 为什么不使用HJSON?
- 为什么不霍康?
- 为什么不使用INI文件?
- 为什么不使用JSON模式进行验证?
- 为什么不使用简单配置文件的JSON?
- 为什么不JSON5?
- 为什么不使用YAML 1.2标准? – 我们不需要新标准!
- 为什么不将Kwalify与标准YAML一起验证我的YAML?
- 为什么不使用Python的架构库(或类似)进行验证?
- 为什么不使用sdlang?
- Toml怎么了?
- 为什么我不应该只使用Python代码进行配置?
- 为什么不使用XML进行配置或DSL?
使用strictyaml
如何:
- 在代码中从头开始构建YAML文档
- 要么/或模式验证不同的,同样有效的不同种类的YAML
- 标签异常
- 合并YAML文件
- 重新验证已经验证的文档
- 阅读YAML,编辑并将其写回去
- 获取yaml元素的行数
- 没有模式的山药解析
复合验证器:
- 固定长度序列(reideseq)
- 结合定义和未定义键的映射(MAPCOMBINED)
- 具有任意关键名称的映射(Mappattern)
- 用定义的键和自定义密钥验证器(MAP)映射
- 使用解析映射的YAML对象
- 用定义键的映射(地图)
- 带有默认值的可选键(地图/可选)
- 验证映射中的可选键(地图)
- 独特物品的序列(Uniqueseq)
- 序列/列表验证器(SEQ)
- 使用模式更新文档
标量验证器:
- 布尔(布尔)
- 解析逗号分开的物品(连续分离)
- 数据时间(DateTime)
- 十进制数(十进制)
- 电子邮件和URL验证器
- 空密钥验证
- 枚举标量(枚举)
- 浮点号(浮动)
- 十六进制整数(Hexint)
- 整数(int)
- 用REGEXES(REGEX)验证字符串
- 解析字符串(str)
限制:
- 不允许yaml
- 重复键
- 肮脏的负载
设计理由
strictyaml中有一些设计决策引起了争议和/或不明显。这些记录在这里:
- 重复键有什么问题?
- 显式标签有什么问题?
- 流风格的YAML怎么了?
- 挪威问题 – 为什么strictyaml拒绝进行隐式打字,您也应该如此
- 节点锚和参考有什么问题?
- 为什么strictyaml不解析Python对象的直接表示?
- 为什么strictyaml仅从字符串而不是文件中解析?
- 为什么解析速度不是strictyaml的优先级?
- 什么是语法键入?
- 为什么strictyaml会让您定义python的架构 – 一种图灵完整的语言?
明星贡献者
- @Wwoods
- @chrisburr
- @jnichols0
其他贡献者
- @eulores
- @Waltwoods
- @christophergs
- @gvx
- @AlexandRedeCan
- @lots0logs
- @tobbez
- @JaredSampson
- @bobotig
strictyaml还包括Ruamel.yaml的代码,版权所有Anthon van der Neut。
贡献
- 在编写任何代码之前,请阅读有关Hitchdev库的贡献的教程。
- 在编写任何代码之前,如果您提出了新功能,请在Github上提出。如果是现有功能 /错误,请评论并简要描述您将如何实现它。
- 所有代码都需要伴随着一个故事或对现有故事进行修改的故事。这既用于测试代码并构建文档。
