依赖于其他字段的值的条件要求(Conditional requirement dependent o

2019-10-28 11:14发布

依赖于其他领域的价值条件要求Cerberus已经讨论过很多次了。 的使用dependencies不能满足需求,因为字段可以是unknown条件满足时。 用法oneof建议,但它可能是太硬,在满足几个条件和相关工作。 现在所通用的解决方案?

Answer 1:

快速解答(TL; DR)

  • “综合验证”方法允许有条件(环境感知)验证规则。
  • cerberus包支持复合验证“开箱即用”。
  • 复合验证允许具有高度灵活的粒度上的触发条件易于人类可读的规则。

详细的解答

上下文

  • Python 2.7版
  • Cerberus的确认包

问题

  • 开发JasperHuangCreator希望触发条件适用于微调的验证规则。

  • 这种方法可以与复合数据的验证来完成。
  • 在这个用例,复合验证仅仅意味着创建的验证规则,这样的顺序列表:
    • 每个单独的规则上的复合数据变量进行操作
    • 每个单独的规则规定,当规则适用于一个“触发条件”
    • 每个单独的规则产生的三个互相排斥验证的结果之一: validation-successvalidation-fail ,或validation-skipped

Sample documents
aadocuments = []
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