Lewati ke isi

Plugin Pydantic

!!! peringatan Dukungan plugin "Fitur eksperimental" bersifat eksperimental dan dapat berubah dalam rilis kecil. Tidak disarankan mengembangkan plugin sampai fitur menjadi stabil.

Pydantic memungkinkan pengguna membuat plugin yang dapat digunakan untuk memperluas fungsionalitas perpustakaan.

Plugin diinstal melalui titik masuk Python. Anda dapat membaca lebih lanjut tentang titik masuk di spesifikasi Titik masuk dari Otoritas Pengemasan Python.

Jika Anda memiliki proyek bernama my-pydantic-plugin , Anda dapat membuat plugin dengan menambahkan yang berikut ke pyproject.toml Anda :

[project.entry-points.pydantic]
my_plugin = "my_pydantic_plugin:plugin"

Grup titik masuknya adalah pydantic , my_plugin adalah nama pluginnya, my_pydantic_plugin adalah modul tempat memuat objek plugin, dan plugin adalah nama objek yang akan dimuat.

Plugin dimuat sesuai urutan penemuannya, dan urutan penemuannya tidak dijamin.

Sebagai pengguna, Anda dapat mengubah perilaku plugin di BaseModel menggunakan argumen plugin_settings Model Config atau argumen kata kunci kelas. Argumen ini mengambil kamus pengaturan yang akan diteruskan ke semua plugin apa adanya. Plugin kemudian dapat menggunakan pengaturan ini untuk mengubah perilakunya. Direkomendasikan bagi plugin untuk memisahkan pengaturannya ke dalam kunci khusus mereka sendiri di kunci khusus plugin di kamus plugin_settings .

from pydantic import BaseModel


class Foo(BaseModel, plugin_settings={'my-plugin': {'observe': 'all'}}): ...

Bangun sebuah plugin

??? api "Dokumentasi API" pydantic.plugin

Pydantic menyediakan API untuk membuat plugin. API diekspos melalui modul pydantic.plugin .

Di plugin Anda, Anda dapat menggabungkan metode berikut:

Untuk setiap metode, Anda dapat menerapkan callback berikut:

  • on_enter : Dipanggil sebelum validasi suatu bidang dimulai.
  • on_success : Dipanggil ketika validasi suatu bidang berhasil.
  • on_error : Dipanggil ketika validasi suatu bidang gagal.

Mari kita lihat contoh plugin yang menggabungkan metode validate_python dari 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()

Menggunakan Pengaturan Plugin

Anggaplah Anda memiliki plugin bernama setting bernama "observer", maka Anda dapat menggunakannya seperti ini:

from pydantic import BaseModel


class Foo(BaseModel, plugin_settings={'observer': 'all'}): ...

Pada setiap panggilan validasi, plugin_settings akan diteruskan ke callable yang terdaftar untuk acara tersebut.

Menonaktifkan Plugin

Anda dapat menggunakan variabel lingkungan PYDANTIC_DISABLE_PLUGINS untuk menonaktifkan semua atau plugin tertentu.


Variabel Lingkungan

Nilai yang Diizinkan

Keterangan
PYDANTIC_DISABLE_PLUGINS
__all__ , 1 , true

Menonaktifkan semua plugin

String yang dipisahkan koma (misalnya my-plugin-1,my-plugin2 )

Menonaktifkan plugin tertentu

本文总阅读量