c11a63c8a5b25801fbe903a6d64ee0001b7e10e6
megasniff
Автоматическая валидация данных по схеме и сборка объекта в одном флаконе
Как применять:
# 1. Объявляем схемы
from __future__ import annotations
import dataclasses
import typing
@dataclasses.dataclass
class SomeSchema1:
a: int
b: float | str
c: SomeSchema2 | str | None
class SomeSchema2(typing.TypedDict):
field1: dict
field2: float
field3: typing.Optional[SomeSchema1]
# 2. Генерируем метод для валидации и сборки
import megasniff
infl = megasniff.SchemaInflatorGenerator()
fn = infl.schema_to_inflator(SomeSchema1)
# 3. Проверяем что всё работает
fn({'a': 1, 'b': 2, 'c': {'field1': {}, 'field2': '1.1', 'field3': None}})
# SomeSchema1(a=1, b=2.0, c={'field1': {}, 'field2': 1.1, 'field3': None})
Особенности работы:
- поддерживает циклические зависимости
- проверяет
Union-типы через ретрай на выбросе исключения - по умолчанию использует готовый щаблон для кодогенерации и исполняет его по запросу, требуется особое внимание к сохранности данного шаблона
- проверяет типы списков, может приводить списки к множествам
- не проверяет типы generic-словарей, кортежей (реализация ожидается)
- пользовательские проверки типов должны быть реализованы через наследование и проверки в конструкторе
- опциональный
strict-mode: выключение приведения базовых типов - может генерировать кортежи верхнеуровневых объектов при наличии описания схемы (полезно при развертывании аргументов)
Как установить:
uv:
uv add megasniff --index sniff_index=https://git.nikto-b.ru/api/packages/nikto_b/pypi/simple
poetry:
- Добавить репозиторий в
pyproject.toml
poetry source add --priority=supplemental sniff_index https://git.nikto-b.ru/api/packages/nikto_b/pypi/simple
- Поставить пакет
poetry add --source sniff_index megasniff
Strict-mode:
Strict-mode off:
@dataclass
class A:
a: list[int]
>>> {"a": [1, 1.1, "321"]}
<<< A(a=[1, 1, 321])
Strict-mode on:
@dataclass
class A:
a: list[int]
>>> {"a": [1, 1.1, "321"]}
<<< FieldValidationException, т.к. 1.1 не является int
Tuple unwrap
fn = infl.schema_to_inflator(
(('a', int), TupleSchemaItem(Optional[list[int]], key_name='b', has_default=True, default=None)))
Создаёт fn: (dict[str,Any]) -> tuple[int, Optional[list[int]]]: ... (сигнатура остаётся (dict[str,Any])->tuple)
Languages
Python
84%
Jinja
16%