Pydantic-Plugins
!!! Warnung „Experimentelle Funktion“ Die Plugin-Unterstützung ist experimentell und kann sich in Nebenversionen ändern. Die Entwicklung von Plugins wird nicht empfohlen, bis die Funktion stabil ist.
Mit Pydantic können Benutzer Plugins erstellen, mit denen die Funktionalität der Bibliothek erweitert werden kann.
Plugins werden über Python-Einstiegspunkte installiert. Weitere Informationen zu Einstiegspunkten finden Sie in der Spezifikation „Einstiegspunkte“ der Python Packaging Authority.
Falls Sie ein Projekt namens my-pydantic-plugin
haben, können Sie ein Plugin erstellen, indem Sie Folgendes zu Ihrer pyproject.toml
hinzufügen:
[project.entry-points.pydantic]
my_plugin = "my_pydantic_plugin:plugin"
Die Einstiegspunktgruppe ist pydantic
, my_plugin
ist der Name des Plugins, my_pydantic_plugin
ist das Modul, aus dem das Plugin-Objekt geladen werden soll, und plugin
ist der zu ladende Objektname.
Plugins werden in der Reihenfolge geladen, in der sie gefunden werden. Die Reihenfolge, in der sie gefunden werden, kann nicht garantiert werden.
Als Benutzer können Sie das Verhalten des Plugins in einem BaseModel
mithilfe des Arguments plugin_settings
Model Config “ oder des Schlüsselwortarguments „class“ ändern. Dieses Argument benötigt ein Wörterbuch mit Einstellungen, das unverändert an alle Plugins übergeben wird. Das Plugin kann diese Einstellungen dann verwenden, um sein Verhalten zu ändern. Für Plugins wird empfohlen, ihre Einstellungen in ihre eigenen dedizierten Schlüssel in einem Plugin-spezifischen Schlüssel im Wörterbuch plugin_settings
aufzuteilen.
from pydantic import BaseModel
class Foo(BaseModel, plugin_settings={'my-plugin': {'observe': 'all'}}): ...
Erstellen Sie ein Plugin¶
??? API „API-Dokumentation“ pydantic.plugin
Pydantic stellt eine API zum Erstellen von Plugins bereit. Die API wird über das Modul pydantic.plugin
bereitgestellt.
In Ihrem Plugin können Sie die folgenden Methoden einschließen :
validate_python
: Wird zum Validieren der Daten eines Python-Objekts verwendet.validate_json
: Wird zum Validieren der Daten aus einer JSON-Zeichenfolge verwendet.validate_strings
: Wird zum Validieren der Daten aus Strings verwendet.
Für jede Methode können Sie die folgenden Rückrufe implementieren:
on_enter
: Wird aufgerufen, bevor die Validierung eines Felds beginnt.on_success
: Wird aufgerufen, wenn die Validierung eines Felds erfolgreich ist.on_error
: Wird aufgerufen, wenn die Validierung eines Felds fehlschlägt.
Sehen wir uns ein Beispiel eines Plugins an, das die Methode validate_python
des SchemaValidator
umschließt .
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()
Verwenden von Plugin-Einstellungen¶
Bedenken Sie, dass Sie ein Plugin namens „observer“ haben, dann können Sie es wie folgt verwenden:
from pydantic import BaseModel
class Foo(BaseModel, plugin_settings={'observer': 'all'}): ...
Bei jedem Validierungsaufruf werden die plugin_settings
an einen für die Ereignisse registrierten Aufruf übergeben.
Plugins deaktivieren¶
Sie können die Umgebungsvariable PYDANTIC_DISABLE_PLUGINS
verwenden, um alle oder bestimmte Plugins zu deaktivieren.
Umgebungsvariable | Zulässige Werte | Beschreibung |
---|---|---|
PYDANTIC_DISABLE_PLUGINS | __all__ , 1 , true | Deaktiviert alle Plugins |
Durch Kommas getrennte Zeichenfolge (z. B. my-plugin-1,my-plugin2 ) | Deaktiviert angegebene(s) Plugin(s) |
本文总阅读量次