有条件的要求取决于其他字段的值

时间:2018-11-30 02:48:02

标签: python validation conditional cerberus

取决于Cerberus中其他字段值的条件要求已经讨论了很多次。 dependencies的使用不满足需求,因为在满足条件时可以unknown字段。建议使用oneof,但在满足多个条件和相关性的情况下,可能很难工作。现在有什么通用解决方案?

1 个答案:

答案 0 :(得分:0)

快速解答(TL; DR)

  • “复合验证”方法允许有条件的(上下文感知)验证规则。
  • python cerberus软件包支持“开箱即用”的复合验证。
  • 复合验证允许在触发条件上具有高度灵活的粒度的易于理解的规则。

详细答案

上下文

  • python 2.7
  • cerberus验证包

问题

  • 开发人员JasperHuangCreator希望将触发条件应用于经过微调的验证规则。

解决方案

  • 这种方法可以通过复合数据验证来实现。
  • 在此用例下,复合验证仅意味着创建验证规则的顺序列表,例如:
    • 每个规则都对复合数据变量进行操作
    • 每条规则都为该规则适用时指定了“触发条件”
    • 每个单独的规则都会产生三个互斥的验证结果之一:validation-successvalidation-failvalidation-skipped

示例

样本文件
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
  '''))
验证规则样本
- 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的依赖。

另请参见