跳转至

Pydantic 插件

警告

“实验性功能”插件支持是实验性的,可能会在小版本中发生变化。在该功能稳定之前,不建议开发插件。

Pydantic 允许用户创建插件,这些插件可用于扩展库的功能。

插件通过 Python 入口点安装。你可以在 Python 打包权威机构的入口点规范中了解更多关于入口点的信息。

如果您有一个名为 my-pydantic-plugin 的项目,您可以通过在 pyproject.toml 中添加以下内容来创建一个插件:

[project.entry-points.pydantic]
my_plugin = "my_pydantic_plugin:plugin"

入口点组为 pydanticmy_plugin 是插件的名称, my_pydantic_plugin 是从中加载插件对象的模块, plugin 是要加载的对象名称。

插件是按找到的顺序加载的,并且找到的顺序不能保证。

作为用户,您可以使用 plugin_settings Model Config 或类关键字参数在 BaseModel 中修改插件的行为。此参数接受一个设置字典,该字典将原封不动地传递给所有插件。插件可以使用这些设置来修改其行为。建议插件将其设置分离到插件特定键的 plugin_settings 字典中的自己的专用键中。

from pydantic import BaseModel


class Foo(BaseModel, plugin_settings={'my-plugin': {'observe': 'all'}}): ...

Build a plugin

构建插件

API 文档

pydantic.plugin

Pydantic 提供了创建插件的 API。该 API 通过 pydantic.plugin 模块公开。

在你的插件中,你可以包装以下方法:

  • validate_python : 用于验证来自 Python 对象的数据。

  • validate_json : 用于验证来自 JSON 字符串的数据。

  • [ 验证字符串的@pydantic_core.SchemaValidator.validate_strings]:用于验证字符串数据。

对于每种方法,您都可以实现以下回调:

  • on_enter :在字段验证开始之前调用。
  • 当字段验证成功时调用。
  • 当字段验证失败时调用。 让我们来看一个插件的示例,该插件包装了 SchemaValidator validate_python 方法。
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()

使用插件设置

考虑到你有一个名为“observer”的插件,那么你可以这样使用它:

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

禁用指定的插件(s)


本文总阅读量