valdec - декоратор для валидации аргументов и результата функций и методов класса

Репозитарий: https://github.com/EvgeniyBurdin/valdec (примеры там).

Могут быть отвалидированы все аргументы с аннотацией, и результат.

Можно валидировать обычные и асинхронные функции (два варианта декоратора).

Можно написать свою функцию для валидации, и подсунуть ее в настройки декоратора.

Если у результата нет аннотации, то считается что должно возвращаться None.

Управление списком полей, подлежащих валидации, осуществляется в аргументах декоратора:
- Если там пусто, то валидируются все аргументы функции и результат;
- Если указаны конкретные имена аргументов (для возврата это “return”), то валидируются только они;
- Если после перечисления имен указать exclude=True, то валидироваться будут все аргументы кроме перечисленных.

Валидация происходит при помощи создания экземпляра валидирующего класса. То есть, аргументы функции маппятся в поля этого класса.
На текущий момент “из коробки” поддерживаются классы pydantic.BaseModel и validated_dc.ValidatedDC.
По умолчанию работает pydantic.BaseModel, но можно очень просто переключить (пример в репозитарии).
Так же можно легко добавить и любую другую функцию-валидатор, для этого нужна только совместимая сигнатура.

В коде можно одновременно использовать декораторы с валидаторами разных типов.

Если в аннотации имеется экземпляр класса который используется для валидации, то возможно “подменить” входящее значение на экземпляр класса (поведение по умолчанию), но это можно и отключить.
Причем, возможно управлять “подменой” - раздельно для входящих значений и результата.

Допустим, на вход прилетел список словарей и в аннотации для этого аргумента указан список экземпляров валидирующего класса (причем, этот класс может иметь поля в которых так же есть потомки этого класса). Тогда в функцию, при успешной валидации, попадет список экземпляров класса.
Аналогичный механизм работает и для возврата (из функции отдаем список словарей, но по факту улетит список экземпляров).
Но, повторюсь, этим поведением можно управлять в настройках декоратора (так как такие манипуляции не всегда нужны), сохранив, тем не менее, валидацию.

В аннотациях с классами pydantic.BaseModel можно использовать все (вроде) алиасы из typing, но там есть нюансы с автоматическим приведением типов и маппингом полей. Первое решается использованием “строгих типов”, второе в настройках классов моделей.

В аннотациях с дакаклассами validated_dc.ValidatedDC можно использовать алиасы Any, List, Literal, Optional, Union, но зато попроще :), и их вполне хватает для описания json.