Этот пакет предоставляет способ автоматически производить аннотации типа на основе jsonschema -Schemas.
Не все концепции, охватываемые jsonschema , выражаются в рамках аннотаций питона. Тем не менее, большинство вещей будут работать так, как вы ожидаете. Большинство типов переводятся тривиально ( integer , number , string , array , boolean и null ). Интересным типом является object , который переводится в TypedDict .
Предупреждение: это основано на системе плагинов Mypy, которая, как утверждается, не имеет гарантии обратной совместимости. Новые версии Mypy могут не поддерживать немедленно.
Схема JSON:
{
"$schema" : " http://json-schema.org/draft-07/schema# " ,
"$id" : " http://foo.qwerty/some/schema# " ,
"title" : " Foo Schema " ,
"type" : " object " ,
"properties" : {
"title" : {
"type" : " string "
},
"awesome" : {
"type" : " number "
}
},
"required" : [ " title " ]
}TypedDict:
from typing import TYPE_CHECKING
from jsonschema_typed import JSONSchema
data : JSONSchema [ "path/to/schema.json" ] = { "title" : "baz" }
if TYPE_CHECKING :
reveal_type ( data ) # Revealed type is 'TypedDict('FooSchema', {'title': builtins.str,
# 'awesome'?: Union[builtins.int, builtins.float]})'
data [ "description" ] = "there is no description" # TypedDict "FooSchema" has no key 'description'
data [ "awesome" ] = 42
data [ "awesome" ] = None # Argument 2 has incompatible type "None"; expected "Union[int, float]"Вы также можете получить типы частей схемы, а также типы элементов в массивах. Взгляните на тестовые примеры для получения дополнительных примеров использования.
pip install jsonschema-typed Вам также необходимо включить плагин (ы) в вашем файле конфигурации mypy.ini :
# mypy.ini
[ mypy ]
plugins = j sonschema_typed.plugin, jsonschema_typed.optional_typed_dict
# Due to a quirk of how these type hints are generated, mypy's caching breaks.
# Disabling caching might be required.
cache_dir = / dev/null Вышеуказанные инсталляции разрешают зависимости, которые состоят из mypy и jsonschema (естественно). Тестирование было сделано с версиями:
Вероятно, некоторые старые версии также будут работать. Сообщите о проблеме, если вам нужны другие версии.
additionalProperties на самом деле не имеют эквивалента в TypedDict.default не поддерживается; Но см. Python/Mypy#6131."#" ) не может действительно работать должным образом, пока не будут поддержаны вложенные прогнозные ссылки; Смотрите: Python/Mypy#731.