Для использования "Абстрактного Валидатора" потребуется одна или более конкретных стратегий проверки. В нашем примере мы опишем:
проверку факта принадлежности полученного данного типу "строка",
проверку длины строки (используя ограничения 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 не будет соответствующих именованных параметров):
Когда стратегии валидации описаны, создать конкретный валидатор можно путем указания перечня стратегий валидации (в виде списка) как показано ниже.
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