Для использования "Абстрактного Валидатора" потребуется одна или более конкретных стратегий проверки. В нашем примере мы опишем:
проверку факта принадлежности полученного данного типу "строка",
проверку длины строки (используя ограничения min_length и max_length).
Пример реализации таких стратегий приведен ниже.
defis_string(obj: v.VObj,params: v.VParams)->None: t =type(obj)if t !=str:raise v.ValError(f'Полученный объект {repr(obj)} имеет некорректный тип {t}. 'f'Требуется строка')defcorrect_length(obj: v.VObj,params: v.VParams)->None: mn = params.get('min_length',1) mx = params.get('max_length',32) ln =len(obj)ifnot 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 не будет соответствующих именованных параметров):
Создание валидатора
Когда стратегии валидации описаны, создать конкретный валидатор можно путем указания перечня стратегий валидации (в виде списка) как показано ниже.
Применение валидатора
Применение через явный вызов метода validate
Позитивный тест
Применим описанные выше стратегии проверки к строке "Васисуалий" (без параметров):
Прогон завершился с кодом 0 (в рамках нашего примера полученные данные являются строкой корректной длины: для проверки применены параметры по умолчанию (минимальная длина = 1 и максимальная = 32).
Негативный тест
Передадим заведомо более длинную строку:
Прогон завершился аварийно (поднято исключение).
Указание параметров
Проверим ту же длинную строку, но указав соответствующие параметры:
Прогон завершился с кодом 0 (теперь строка попадает в заданный диапазон допустимых значений длины).
Применение через декоратор
Позитивный тест
Для тестового примера опишем класс "Пользователь":
В данном примере к методу __init__ применен декоратор с указанием параметров.
При попытке установить значение (при создании экземпляра класса) будет вызван метод validate валидатора val.
Негативный тест
При указанных граничных значениях (максимальная длина = 10), попытка создать объект класса UserName с указанием строки "Очень длинная строчища" вызовет ожидаемое исключение:
***\aval_usage\.venv\Scripts\python.exe ***\aval_usage\main.py
Process finished with exit code 0
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
class UserName:
@val.validate_with(max_length=10, min_length=1)
def __init__(self, value):
self._value = value
u_name = UserName('Вася')
***\aval_usage\.venv\Scripts\python.exe ***\aval_usage\main.py
Process finished with exit code 0
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