Добавлю про возможности...
Могут быть отвалидированы все аргументы с аннотацией, и результат.
Если у результата нет аннотации, то считается что должно возвращаться None
.
Управление списком полей, подлежащих валидации, осуществляется в аргументах декоратора:
- Если там пусто, то валидируются все аргументы функции и результат;
- Если указаны конкретные имена аргументов (для возврата это "return"), то валидируются только они;
- Если после перечисления имен указать exclude=True
, то валидироваться будут все аргументы кроме перечисленных.
Валидация происходит при помощи создания экземпляра валидирующего класса. То есть, аргументы функции маппятся в поля этого класса.
На текущий момент "из коробки" поддерживаются классы pydantic.BaseModel
и validated_dc.ValidatedDC
.
По умолчанию работает pydantic.BaseModel
, но можно очень просто переключить (пример в описании репо).
Так же можно легко добавить и любую другую функцию-валидатор, для этого нужна только совместимая сигнатура.
В коде можно одновременно использовать декораторы с валидаторами разных типов.
Если в аннотации имеется экземпляр класса который используется для валидации, то возможно "подменить" входящее значение на экземпляр класса (поведение по умолчанию), но это можно и отключить.
Причем, возможно управлять "подменой" - раздельно для входящих значений и результата.
Допустим, на вход прилетел список словарей и в аннотации для этого аргумента указан список экземпляров валидирующего класса (причем, этот класс может иметь поля в которых так же есть потомки этого класса). Тогда в функцию, при успешной валидации, попадет список экземпляров класса.
Аналогичный механизм работает и для возврата (из функции отдаем список словарей, но по факту улетит список экземпляров).
Но, повторюсь, этим поведением можно управлять в настройках декоратора (так как такие манипуляции не всегда нужны), сохранив, тем не менее, валидацию.
В аннотациях с классами pydantic.BaseModel
можно использовать все (вроде) алиасы из typing
, но там есть нюансы с автоматическим приведением типов и маппингом полей. Первое решается использованием “строгих типов”, второе в настройках классов моделей..
В аннотациях с дакаклассами validated_dc.ValidatedDC
можно использовать алиасы Any
, List
, Literal
, Optional
, Union
, но зато все попроще :), и их вполне хватает для описания json
.
Updated 7 Jan. 2021, 15:14 by EvgIq.