Pydantic 插件
警告
“实验性功能”插件支持是实验性的,可能会在小版本中发生变化。在该功能稳定之前,不建议开发插件。
Pydantic 允许用户创建插件,这些插件可用于扩展库的功能。
插件通过 Python 入口点安装。你可以在 Python 打包权威机构的入口点规范中了解更多关于入口点的信息。
如果您有一个名为 my-pydantic-plugin
的项目,您可以通过在 pyproject.toml
中添加以下内容来创建一个插件:
[project.entry-points.pydantic]
my_plugin = "my_pydantic_plugin:plugin"
入口点组为 pydantic
, my_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 提供了创建插件的 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)
本文总阅读量次