Быстрый ответ (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.
См. Также