不同但同样有效的 YAML 类型的“或”模式验证
StrictYAML 可以被定向为解析两个不同的元素或 YAML 块。
如果第一个东西没有解析正确,它尝试解析第二个。 如果第二个解析不正确,它会抛出异常。
from strictyaml import Map, Seq, Bool, Int, Str, YAMLValidationError, load
from ensure import Ensure
schema = Str() | Map({"a": Bool() | Int()})
布尔值首选 true
a: yes
Ensure(load(yaml_snippet, schema)).equals({"a": True})
布尔值首选 false
a: no
Ensure(load(yaml_snippet, schema)).equals({"a": False})
Int 次选
a: 5
Ensure(load(yaml_snippet, schema)).equals({"a": 5})
无效 - 不是 bool 或 int
a: A
load(yaml_snippet, schema)
strictyaml.exceptions.YAMLValidationError:
when expecting an integer
found arbitrary text
in "<unicode string>", line 1, column 1:
a: A
^ (line: 1)
多个映射的无效组合
a: x
load(yaml_snippet, Map({"a": Str()}) | Map({"b": Str()}))
strictyaml.exceptions.InvalidValidatorError:
You tried to Or ('|') together 2 Map validators. Try using revalidation instead.
多个序列的无效组合
- 1
- 2
load(yaml_snippet, Seq(Int()) | Seq(Str()))
strictyaml.exceptions.InvalidValidatorError:
You tried to Or ('|') together 2 Seq validators. Try using revalidation instead.
验证后更改项目
a: yes
yaml = load(yaml_snippet, schema)
yaml['a'] = 5
assert yaml['a'] == 5