Ответ 1
Я выпустил "pyvaru" (https://github.com/daveoncode/pyvaru) пару дней назад, это простая, гибкая и ненавязчивая библиотека проверки данных для Python 3 (3.4+), основанный на концепции правил проверки.
Цитата из документа:
Учитывая существующую модель для проверки, как показано ниже (но она может быть простым словарем или любой структурой данных, поскольку pyvaru не сделайте любое предположение в формате данных):
class User: def __init__(self, first_name: str, last_name: str, date_of_birth: datetime, sex: str): self.first_name = first_name self.last_name = last_name self.date_of_birth = date_of_birth self.sex = sex
Мы должны определить валидатор, реализуя метод get_rules() и для каждого поля, которое мы хотим проверить, мы должны предоставить один или несколько правильное правило (ы).
from pyvaru import Validator from pyvaru.rules import TypeRule, FullStringRule, ChoiceRule, PastDateRule class UserValidator(Validator): def get_rules(self) -> list: user = self.data # type: User return [ TypeRule(apply_to=user, label='User', valid_type=User, error_message='User must be an instance of user model.', stop_if_invalid=True), FullStringRule(user.first_name, 'First name'), FullStringRule(user.last_name, 'Last name'), ChoiceRule(user.sex, 'Sex', choices=('M', 'F')), PastDateRule(user.date_of_birth, 'Date of birth') ]
Наконец, у нас есть два варианта использования нашего пользовательского валидатора:
В качестве процессора контекста:
with UserValidator(user): # do whatever you want with your valid model
В этом случае код внутри с будет выполняться, только если проверка достоверности, в противном случае исключение ValidationException (содержащее свойство validation_result с соответствующим отчетом).
Вызов метода validate() (который возвращает ValidationResult)
validation = UserValidator(user).validate() if validation.is_successful(): # do whatever you want with your valid model else: # you can take a proper action and access validation.errors # in order to provide a useful message to the application user, # write logs or whatever
Предположим, что у нас есть экземпляр пользователя, настроенного как ниже:
user = User(first_name=' ', last_name=None, date_of_birth=datetime(2020, 1, 1), sex='unknown')
Запустив проверку с предыдущими определенными правилами, мы получим ValidationResult со следующими ошибками:
{ 'First name': ['String is empty.'], 'Last name': ['Not a string.'], 'Sex': ['Value not found in available choices.'], 'Date of birth': ['Not a past date.'] }