Pydantic-plugins
!!! waarschuwing "Experimentele functie" Ondersteuning voor plug-ins is experimenteel en kan in kleine releases worden gewijzigd. Het ontwikkelen van plug-ins wordt niet aanbevolen totdat de functie stabiel wordt.
Met Pydantic kunnen gebruikers plug-ins maken die kunnen worden gebruikt om de functionaliteit van de bibliotheek uit te breiden.
Plug-ins worden geïnstalleerd via Python-toegangspunten. Meer over entrypunten leest u in de Entrypoints-specificatie van de Python Packaging Authority.
Als u een project heeft met de naam my-pydantic-plugin
, kunt u een plug-in maken door het volgende toe te voegen aan uw pyproject.toml
:
[project.entry-points.pydantic]
my_plugin = "my_pydantic_plugin:plugin"
De ingangspuntgroep is pydantic
, my_plugin
is de naam van de plug-in, my_pydantic_plugin
is de module waaruit het plug-inobject moet worden geladen, en plugin
is de objectnaam die moet worden geladen.
Plug-ins worden geladen in de volgorde waarin ze worden gevonden, en de volgorde waarin ze worden gevonden is niet gegarandeerd.
Als gebruiker kunt u het gedrag van de plug-in in een BaseModel
wijzigen met behulp van het plugin_settings
Model Config- argument of het class-trefwoordargument. Voor dit argument is een woordenboek met instellingen nodig dat ongewijzigd aan alle plug-ins wordt doorgegeven. De plug-in kan deze instellingen vervolgens gebruiken om zijn gedrag te wijzigen. Het wordt voor plug-ins aanbevolen om hun instellingen te scheiden in hun eigen speciale sleutels in een plug-in-specifieke sleutel in het woordenboek plugin_settings
.
from pydantic import BaseModel
class Foo(BaseModel, plugin_settings={'my-plugin': {'observe': 'all'}}): ...
Bouw een plug-in¶
??? api "API-documentatie" pydantic.plugin
Pydantic biedt een API voor het maken van plug-ins. De API wordt toegankelijk gemaakt via de pydantic.plugin
-module.
Op uw plug-in kunt u de volgende methoden inpakken :
validate_python
: wordt gebruikt om de gegevens van een Python-object te valideren.validate_json
: wordt gebruikt om de gegevens uit een JSON-tekenreeks te valideren.validate_strings
: wordt gebruikt om de gegevens uit tekenreeksen te valideren.
Voor elke methode kunt u de volgende callbacks implementeren:
on_enter
: Wordt aangeroepen voordat de validatie van een veld begint.on_success
: Wordt aangeroepen wanneer de validatie van een veld slaagt.on_error
: Wordt aangeroepen wanneer de validatie van een veld mislukt.
Laten we een voorbeeld bekijken van een plug-in die de validate_python
-methode van de SchemaValidator
omhult .
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()
Plugin-instellingen gebruiken¶
Bedenk dat je een plug-in hebt met de naam setting genaamd "observer", dan kun je deze als volgt gebruiken:
from pydantic import BaseModel
class Foo(BaseModel, plugin_settings={'observer': 'all'}): ...
Bij elke validatieoproep worden de plugin_settings
doorgegeven aan een opvraagbare persoon die voor de gebeurtenissen is geregistreerd.
Plug-ins uitschakelen¶
U kunt omgevingsvariabele PYDANTIC_DISABLE_PLUGINS
gebruiken om alle of specifieke plug-ins uit te schakelen.
Omgevingsvariabele | Toegestane waarden | Beschrijving |
---|---|---|
PYDANTIC_DISABLE_PLUGINS | __all__ , 1 , true | Schakelt alle plug-ins uit |
Door komma's gescheiden tekenreeks (bijvoorbeeld my-plugin-1,my-plugin2 ) | Schakelt gespecificeerde plug-in(s) uit |
本文总阅读量次