依赖于其他领域的价值条件要求Cerberus
已经讨论过很多次了。 的使用dependencies
不能满足需求,因为字段可以是unknown
条件满足时。 用法oneof
建议,但它可能是太硬,在满足几个条件和相关工作。 现在所通用的解决方案?
Answer 1:
快速解答(TL; DR)
- “综合验证”方法允许有条件(环境感知)验证规则。
- 蟒
cerberus
包支持复合验证“开箱即用”。 - 复合验证允许具有高度灵活的粒度上的触发条件易于人类可读的规则。
详细的解答
上下文
- Python 2.7版
- Cerberus的确认包
问题
- 开发JasperHuangCreator希望触发条件适用于微调的验证规则。
解
- 这种方法可以与复合数据的验证来完成。
- 在这个用例,复合验证仅仅意味着创建的验证规则,这样的顺序列表:
- 每个单独的规则上的复合数据变量进行操作
- 每个单独的规则规定,当规则适用于一个“触发条件”
- 每个单独的规则产生的三个互相排斥验证的结果之一:
validation-success
,validation-fail
,或validation-skipped
例
Sample documentsaadocuments = []
aadocuments.append(yaml.safe_load('''
person_fname: homer
person_lname: himpson
person_age: 33
prize_caption: free beer for life
prize_email: prizes@abcbooze.com
prize_category: alchohol
'''))
aadocuments.append(yaml.safe_load('''
person_fname: helen
person_lname: himpson
person_age: 16
prize_caption: free ammo for life
prize_email: prizes@zzzguns.com
prize_category: firearms
'''))
Sample validation rules
- rule_caption: check-required-fields
rule_vpath: "@"
validation_schema:
person_fname:
type: string
required: true
person_lname:
type: string
required: true
person_age:
type: string
required: true
- rule_caption: check-age-range
rule_vpath: '@|@.person_age'
validation_schema:
person_age:
"min": 2
"max": 120
- rule_caption: check-underage-minor
rule_vpath: '[@]|[? @.person_age < `18`]'
validation_schema:
prize_category:
type: string
allowed: ['pets','toys','candy']
prize_email:
type: string
regex: '[\w]+@.*'
- 上面的代码的多个验证规则YAML格式化表示。
- 上面的代码指定通过使用的触发条件
rule_vpath
名称-值对。
合理
- 这种方法可以扩展到复杂的任意水平。
- 这种方法是由人类容易理解的(虽然jmespath语法可以在第一挑战)。
- 任何任意复杂的一组条件和约束可以使用这种方法来建立。
陷阱
- 以上的例子使用jmespath语法指定
rule_vpath
,它告诉系统何时触发特定的规则,这增加了上jmespath的依赖性。
也可以看看
- 在github上完整的代码示例
文章来源: Conditional requirement dependent on value of other fields