Условное требование зависит от значения других полей - PullRequest
0 голосов
/ 30 ноября 2018

Условное требование, зависящее от значения других полей в Cerberus, обсуждалось много раз.Использование dependencies не соответствует потребностям, потому что поля могут быть unknown, когда выполняются условия.Было рекомендовано использование oneof, но это может быть слишком сложно для работы, когда выполняются несколько условий и зависимостей.Какое универсальное решение сейчас?

1 Ответ

0 голосов
/ 21 марта 2019

Быстрый ответ (TL; DR)

  • Подход "составной проверки" допускает условные (контекстно-зависимые) правила проверки.
  • Пакет python cerberus поддерживает составнойпроверка "из коробки".
  • Составная проверка допускает легко читаемые человеком правила с очень гибкой детализацией условий запуска.

Подробный ответ

Контекст

  • python 2.7
  • пакет проверки cerberus

Проблема

  • Разработчик JasperHuangCreator желает применить условия запуска для fine-настроенные правила проверки.

Решение

  • Этот подход может быть реализован с проверкой составных данных.
  • В этом сценарии использования составная проверка просто означает созданиепоследовательный список правил проверки, такой что:
    • Каждое отдельное правило работает с составной переменной данных
    • Каждое отдельное правило задает "запускающий«когда применяется правило»
    • Каждое отдельное правило дает один из трех взаимоисключающих результатов проверки: validation-success, validation-fail или validation-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.

См. Также

...