Плагины Pydantic
!!! предупреждение «Экспериментальная функция» Поддержка плагинов является экспериментальной и может быть изменена в небольших выпусках. Разрабатывать плагины не рекомендуется, пока функция не станет стабильной.
Pydantic позволяет пользователям создавать плагины, которые можно использовать для расширения функциональности библиотеки.
Плагины устанавливаются через точки входа Python. Вы можете прочитать больше о точках входа в спецификации точек входа от Python Packaging Authority.
Если у вас есть проект под названием my-pydantic-plugin
, вы можете создать плагин, добавив в pyproject.toml
следующее:
[project.entry-points.pydantic]
my_plugin = "my_pydantic_plugin:plugin"
Группа точек входа — pydantic
, my_plugin
— имя плагина, my_pydantic_plugin
— модуль, из которого загружается объект плагина, а plugin
— имя загружаемого объекта.
Плагины загружаются в том порядке, в котором они найдены, и порядок их обнаружения не гарантируется.
Как пользователь, вы можете изменить поведение плагина в BaseModel
используя аргумент конфигурации модели plugin_settings
или аргумент ключевого слова класса. Этот аргумент принимает словарь настроек, который будет передан всем плагинам как есть. Затем плагин может использовать эти настройки для изменения своего поведения. Плагинам рекомендуется разделить свои настройки на отдельные ключи в специальном ключе плагина в словаре plugin_settings
.
from pydantic import BaseModel
class Foo(BaseModel, plugin_settings={'my-plugin': {'observe': 'all'}}): ...
Создайте плагин¶
??? API "Документация по API" pydantic.plugin
Pydantic предоставляет API для создания плагинов. API предоставляется через модуль pydantic.plugin
.
В вашем плагине вы можете обернуть следующие методы:
validate_python
: используется для проверки данных из объекта Python.validate_json
: используется для проверки данных из строки JSON.validate_strings
: используется для проверки данных из строк.
Для каждого метода вы можете реализовать следующие обратные вызовы:
on_enter
: вызывается перед началом проверки поля.on_success
: вызывается при успешной проверке поля.on_error
: вызывается, когда проверка поля не удалась.
Давайте посмотрим пример плагина, который оборачивает метод validate_python
SchemaValidator
.
from typing import Any, Dict, Optional, Union
from pydantic_core import CoreConfig, CoreSchema, ValidationError
from pydantic.plugin import (
NewSchemaReturns,
PydanticPluginProtocol,
SchemaKind,
SchemaTypePath,
ValidatePythonHandlerProtocol,
)
class OnValidatePython(ValidatePythonHandlerProtocol):
def on_enter(
self,
input: Any,
*,
strict: Optional[bool] = None,
from_attributes: Optional[bool] = None,
context: Optional[Dict[str, Any]] = None,
self_instance: Optional[Any] = None,
) -> None:
print(input)
def on_success(self, result: Any) -> None:
print(result)
def on_error(self, error: ValidationError) -> None:
print(error.json())
class Plugin(PydanticPluginProtocol):
def new_schema_validator(
self,
schema: CoreSchema,
schema_type: Any,
schema_type_path: SchemaTypePath,
schema_kind: SchemaKind,
config: Union[CoreConfig, None],
plugin_settings: Dict[str, object],
) -> NewSchemaReturns:
return OnValidatePython(), None, None
plugin = Plugin()
Использование настроек плагина¶
Предположим, что у вас есть плагин под названием «Наблюдатель», и вы можете использовать его следующим образом:
from pydantic import BaseModel
class Foo(BaseModel, plugin_settings={'observer': 'all'}): ...
При каждом вызове проверки plugin_settings
будет передаваться вызываемому объекту, зарегистрированному для событий.
Отключение плагинов¶
Вы можете использовать переменную среды PYDANTIC_DISABLE_PLUGINS
, чтобы отключить все или определенные плагины.
Переменная среды | Разрешенные значения | Описание |
---|---|---|
PYDANTIC_DISABLE_PLUGINS | __all__ , 1 , true | Отключает все плагины |
Строка, разделенная запятыми (например my-plugin-1,my-plugin2 ) | Отключает указанный плагин(ы) |
本文总阅读量次