Plugins Pydantic
!!! avertissement "Fonctionnalité expérimentale" La prise en charge des plugins est expérimentale et est susceptible de changer dans les versions mineures. Le développement de plugins n'est pas recommandé tant que la fonctionnalité n'est pas stable.
Pydantic permet aux utilisateurs de créer des plugins pouvant être utilisés pour étendre les fonctionnalités de la bibliothèque.
Les plugins sont installés via les points d'entrée Python. Vous pouvez en savoir plus sur les points d’entrée dans la spécification des points d’entrée de Python Packaging Authority.
Si vous avez un projet appelé my-pydantic-plugin
, vous pouvez créer un plugin en ajoutant ce qui suit à votre pyproject.toml
:
[project.entry-points.pydantic]
my_plugin = "my_pydantic_plugin:plugin"
Le groupe de points d'entrée est pydantic
, my_plugin
est le nom du plugin, my_pydantic_plugin
est le module à partir duquel charger l'objet plugin et plugin
est le nom de l'objet à charger.
Les plugins sont chargés dans l’ordre dans lequel ils sont trouvés, et l’ordre dans lequel ils sont trouvés n’est pas garanti.
En tant qu'utilisateur, vous pouvez modifier le comportement du plugin dans un BaseModel
à l'aide de l'argument plugin_settings
Model Config ou de l'argument mot-clé de classe. Cet argument prend un dictionnaire de paramètres qui sera transmis tel quel à tous les plugins. Le plugin peut alors utiliser ces paramètres pour modifier son comportement. Il est recommandé aux plugins de séparer leurs paramètres dans leurs propres clés dédiées dans une clé spécifique au plugin dans le dictionnaire plugin_settings
.
from pydantic import BaseModel
class Foo(BaseModel, plugin_settings={'my-plugin': {'observe': 'all'}}): ...
Créer un plugin¶
??? API "Documentation API" pydantic.plugin
Pydantic fournit une API pour créer des plugins. L'API est exposée via le module pydantic.plugin
.
Sur votre plugin, vous pouvez encapsuler les méthodes suivantes:
validate_python
: utilisé pour valider les données d'un objet Python.validate_json
: utilisé pour valider les données d'une chaîne JSON.validate_strings
: utilisé pour valider les données des chaînes.
Pour chaque méthode, vous pouvez implémenter les rappels suivants:
on_enter
: Appelé avant le début de la validation d'un champ.on_success
: Appelé lorsque la validation d'un champ réussit.on_error
: Appelé lorsque la validation d'un champ échoue.
Voyons un exemple de plugin qui encapsule la méthode validate_python
de 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()
Utilisation des paramètres du plugin¶
Considérez que vous disposez d'un plugin appelé paramètre appelé "observer", alors vous pouvez l'utiliser comme ceci:
from pydantic import BaseModel
class Foo(BaseModel, plugin_settings={'observer': 'all'}): ...
A chaque appel de validation, les plugin_settings
seront transmis à un appelable enregistré pour les événements.
Désactivation des plugins¶
Vous pouvez utiliser la variable d'environnement PYDANTIC_DISABLE_PLUGINS
pour désactiver tous les plugins ou certains plugins spécifiques.
Variable d'environnement | Valeurs autorisées | Description |
---|---|---|
PYDANTIC_DISABLE_PLUGINS | __all__ , 1 , true | Désactive tous les plugins |
Chaîne séparée par des virgules (par exemple my-plugin-1,my-plugin2 ) | Désactive les plugins spécifiés |
本文总阅读量次