From ebc296a2706ad795dbfda28e96caccf012fa61ac Mon Sep 17 00:00:00 2001 From: nikto_b Date: Fri, 29 Aug 2025 01:29:04 +0300 Subject: [PATCH] Update README.md --- README.md | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 55afca0..76804b2 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # megasniff -### Автоматическая валидация данных по схеме и сборка объекта в одном флаконе +### Автоматическая валидация данных по схеме, сборка и разборка объекта в одном флаконе #### Как применять: @@ -18,7 +18,8 @@ class SomeSchema1: c: SomeSchema2 | str | None -class SomeSchema2(typing.TypedDict): +@dataclasses.dataclass +class SomeSchema2: field1: dict field2: float field3: typing.Optional[SomeSchema1] @@ -28,12 +29,16 @@ class SomeSchema2(typing.TypedDict): import megasniff infl = megasniff.SchemaInflatorGenerator() -fn = infl.schema_to_inflator(SomeSchema1) +defl = megasniff.SchemaDeflatorGenerator() +fn_in = infl.schema_to_inflator(SomeSchema1) +fn_out = defl.schema_to_deflator(SomeSchema1) # 3. Проверяем что всё работает -fn({'a': 1, 'b': 2, 'c': {'field1': {}, 'field2': '1.1', 'field3': None}}) +data = fn_in({'a': 1, 'b': 2, 'c': {'field1': {}, 'field2': '1.1', 'field3': None}}) # SomeSchema1(a=1, b=2.0, c={'field1': {}, 'field2': 1.1, 'field3': None}) +fn_out(data) +# {'a': 1, 'b': 2.0, 'c': {'field1': {}, 'field2': 1.1, 'field3': None}} ``` @@ -47,7 +52,11 @@ fn({'a': 1, 'b': 2, 'c': {'field1': {}, 'field2': '1.1', 'field3': None}}) - не проверяет типы generic-словарей, кортежей (реализация ожидается) - пользовательские проверки типов должны быть реализованы через наследование и проверки в конструкторе - опциональный `strict-mode`: выключение приведения базовых типов -- может генерировать кортежи верхнеуровневых объектов при наличии описания схемы (полезно при развертывании аргументов) +- для inflation может генерировать кортежи верхнеуровневых объектов при наличии описания схемы (полезно при + развертывании аргументов) +- `TypedDict` поддерживается только для inflation из-за сложностей выбора варианта при сборке `Union`-полей +- для deflation поддерживается включение режима `explicit_casts`, приводящего типы к тем, которые указаны в + аннотациях (не распространяется на `Union`-типы, т.к. невозможно определить какой из них должен быть выбран) ---- @@ -88,6 +97,9 @@ class A: ``` >>> {"a": [1, 1.1, "321"]} <<< A(a=[1, 1, 321]) +>>> A(a=[1, 1.1, "321"]) +<<< {"a": [1, 1.1, "321"]} # explicit_casts=False +<<< {"a": [1, 1, 321]} # explicit_casts=True ``` #### Strict-mode on: @@ -101,11 +113,15 @@ class A: ``` >>> {"a": [1, 1.1, "321"]} <<< FieldValidationException, т.к. 1.1 не является int +>>> A(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`) \ No newline at end of file