Aller au contenu

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:

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

本文总阅读量