🤖
Документация
  • 🧩Микро-решения
    • 🧩Абстрактный валидатор
      • ℹ️Аннотация
      • 🔠Глоссарий
      • 📋Требования
        • 📖Введение
        • 🎯Цели и задачи
        • ⚙️Функциональные требования
        • 🪄Нефункциональные требования
        • 🚧Ограничения
        • 💡Развитие
        • 📚Приложения
      • 🧑‍🏫Руководство
        • 📖Введение
        • 📦Установка
        • 👨‍💻Использование
        • 👾Известные ошибки
      • 🔗Источники
    • 🧩Крипто-ориентированные типы
    • Page 1
  • Group 2
    • Page 3
Powered by GitBook
On this page
  • Импорт пакета
  • Реализация конкретных стратегий проверки
  • Создание валидатора
  • Применение валидатора
  • Применение через явный вызов метода validate
  • Применение через декоратор
  1. Микро-решения
  2. Абстрактный валидатор
  3. Руководство

Использование

Пример использования пакета

Импорт пакета

Импортировать пакет можно как показано ниже.

import aval as v

Реализация конкретных стратегий проверки

Для использования "Абстрактного Валидатора" потребуется одна или более конкретных стратегий проверки. В нашем примере мы опишем:

  • проверку факта принадлежности полученного данного типу "строка",

  • проверку длины строки (используя ограничения min_length и max_length).

Пример реализации таких стратегий приведен ниже.

def is_string(obj: v.VObj, params: v.VParams) -> None:
    t = type(obj)
    if t != str:
        raise v.ValError(
            f'Полученный объект {repr(obj)} имеет некорректный тип {t}. '
            f'Требуется строка'
        )


def correct_length(obj: v.VObj, params: v.VParams) -> None:
    mn = params.get('min_length', 1)
    mx = params.get('max_length', 32)
    ln = len(obj)
    if not mn <= ln <= mx:
        raise v.ValError(
            f'Некорректная длина строки. Требуется строка длинной в пределах '
            f'от {mn} до {mx} (включительно). '
            f'Фактическая длина полученной строки составляет {ln}'
        )

⚠️ важный момент: конкретные стратегии проверки обязательно должны содержать вызов исключения ValError (данный тип импортируется из пакета).

Первый метод отвечает за проверку принадлежности полученного объекта obj типу str. Второй, в свою очередь, проверяет, чтобы длина строки лежала в пределах min_length и max_length.

Аннотация v.VObj позволяет явно указать, что obj является проверяемым объектом. Аналогично можно применить аннотацию к params.

При получении параметров min_length и max_length предусмотрены значения по умолчанию (на случай, если в params не будет соответствующих именованных параметров):

    mn = params.get('min_length', 1)
    mx = params.get('max_length', 32)

Создание валидатора

Когда стратегии валидации описаны, создать конкретный валидатор можно путем указания перечня стратегий валидации (в виде списка) как показано ниже.

val = v.AVal([
    is_string,
    correct_length
])

Применение валидатора

Применение через явный вызов метода validate

Позитивный тест

Применим описанные выше стратегии проверки к строке "Васисуалий" (без параметров):

val.validate('Васисуалий')
***\aval_usage\.venv\Scripts\python.exe ***\aval_usage\main.py 

Process finished with exit code 0

Прогон завершился с кодом 0 (в рамках нашего примера полученные данные являются строкой корректной длины: для проверки применены параметры по умолчанию (минимальная длина = 1 и максимальная = 32).

Негативный тест

Передадим заведомо более длинную строку:

val.validate('Очень длинная строка, длина которой, явно и ощутимо больше 32 '
             'символов')
***\aval_usage\.venv\Scripts\python.exe ***\aval_usage\main.py 
Traceback (most recent call last):
  File "***\aval_usage\.venv\Lib\site-packages\aval\aval.py", line 236, in validate
    method(obj, params)
    ~~~~~~^^^^^^^^^^^^^
  File "***\aval_usage\main.py", line 18, in correct_length
    raise v.ValError(
    ...<3 lines>...
    )
aval.aval.ValError: Некорректная длина строки. Требуется строка длинной в пределах от 1 до 32 (включительно). Фактическая длина полученной строки составляет 70

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "***\aval_usage\main.py", line 31, in <module>
    val.validate('Очень длинная строка, длина которой, явно и ощутимо больше 32 '
    ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                 'символов')
                 ^^^^^^^^^^^
  File "***\aval_usage\.venv\Lib\site-packages\aval\aval.py", line 243, in validate
    raise ValError(INFO.format(en, msg))
aval.aval.ValError: Error [💥=None] with message [✉️="Некорректная длина строки. Требуется строка длинной в пределах от 1 до 32 (включительно). Фактическая длина полученной строки составляет 70"]. The handler is not installed (this message was generated by the validator itself

Process finished with exit code 1

Прогон завершился аварийно (поднято исключение).

Указание параметров

Проверим ту же длинную строку, но указав соответствующие параметры:

val.validate('Очень длинная строка, длина которой, явно и ощутимо '
             'больше 32 символов', min_length=2, max_length=256)    
***\aval_usage\.venv\Scripts\python.exe ***\aval_usage\main.py 

Process finished with exit code 0

Прогон завершился с кодом 0 (теперь строка попадает в заданный диапазон допустимых значений длины).

Применение через декоратор

Позитивный тест

Для тестового примера опишем класс "Пользователь":

class UserName:
    
    @val.validate_with(max_length=10, min_length=1)
    def __init__(self, value):
        self._value = value

В данном примере к методу __init__ применен декоратор с указанием параметров.

При попытке установить значение (при создании экземпляра класса) будет вызван метод validate валидатора val.

u_name = UserName('Вася')
***\aval_usage\.venv\Scripts\python.exe ***\aval_usage\main.py 

Process finished with exit code 0

Негативный тест

При указанных граничных значениях (максимальная длина = 10), попытка создать объект класса UserName с указанием строки "Очень длинная строчища" вызовет ожидаемое исключение:

u_name = UserName('Очень длинная строчища')
***\aval_usage\.venv\Scripts\python.exe ***\aval_usage\main.py 
Traceback (most recent call last):
  File "***\aval_usage\.venv\Lib\site-packages\aval\aval.py", line 236, in validate
    method(obj, params)
    ~~~~~~^^^^^^^^^^^^^
  File "***\aval_usage\main.py", line 18, in correct_length
    raise v.ValError(
    ...<3 lines>...
    )
aval.aval.ValError: Некорректная длина строки. Требуется строка длинной в пределах от 1 до 10 (включительно). Фактическая длина полученной строки составляет 22

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "***\aval_usage\main.py", line 42, in <module>
    u_name = UserName('Очень длинная строчища')
             ~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "***\aval_usage\.venv\Lib\site-packages\aval\aval.py", line 274, in wrapper
    self.validate(obj, **params)
    ~~~~~~~~~~~~~^^^^^^^^^^^^^^^
  File "***\aval_usage\.venv\Lib\site-packages\aval\aval.py", line 243, in validate
    raise ValError(INFO.format(en, msg))
aval.aval.ValError: Error [💥=None] with message [✉️="Некорректная длина строки. Требуется строка длинной в пределах от 1 до 10 (включительно). Фактическая длина полученной строки составляет 22"]. The handler is not installed (this message was generated by the validator itself

Process finished with exit code 1

PreviousУстановкаNextИзвестные ошибки

Last updated 11 months ago

🧩
🧩
🧑‍🏫
👨‍💻
Page cover image