Artificial Intelligence (AI)

Pydantic Tutorial: Data Validation in Python Made Simple

Written by smirow

Pydantic-Tutorial: Datenvalidierung in Python leicht gemachtPydantic-Tutorial: Datenvalidierung in Python leicht gemacht
Bild vom Autor

Python ist eine dynamisch typisierte Sprache. Sie können also Variablen erstellen, ohne den Datentyp explizit anzugeben. Und Sie können derselben Variablen jederzeit einen völlig anderen Wert zuweisen. Dies erleichtert zwar Anfängern die Arbeit, macht es aber genauso einfach, ungültige Objekte in Ihrer Python-Anwendung zu erstellen.

Nun, Sie können Datenklassen erstellen, die die Definition von Feldern mit Typhinweisen ermöglichen. Sie bieten jedoch keine direkte Unterstützung für die Validierung der Daten. Hier kommt Pydantic ins Spiel, eine beliebte Datenvalidierungs- und Serialisierungsbibliothek. Pydantic bietet sofort einsatzbereite Unterstützung für die Datenvalidierung und -serialisierung. Das bedeutet, dass Sie:

  • Python-Typindizes nutzen, um Felder zu validieren,
  • Verwenden Sie benutzerdefinierte Felder und integrierte Validatoren, die von Pydantic angeboten werden, und
  • Definieren Sie nach Bedarf benutzerdefinierte Validatoren.

In diesem Tutorial modellieren wir eine einfache „Employee“-Klasse und validieren die Werte verschiedener Felder mithilfe der Datenvalidierungsfunktion von Pydantic. Lass uns anfangen!

Wenn Sie Python 3.8 oder höher haben, können Sie Pydantic mit pip installieren:

Wenn Sie in Ihrer Anwendung eine E-Mail-Validierung benötigen, können Sie bei der Installation von Pydantic die optionale E-Mail-Validator-Abhängigkeit wie folgt installieren:

$ pip install pydantic[email]

Sie können auch den folgenden Befehl ausführen, um email-validator zu installieren:

$ pip install email-validator

Notiz: In unserem Beispiel verwenden wir die E-Mail-Validierung. Installieren Sie also bitte die Abhängigkeit, wenn Sie codieren möchten.

Lassen Sie uns nun ein einfaches erstellen Employee Klasse. Zuerst erstellen wir eine Klasse, die von erbt BaseModel Klasse. Die verschiedenen Felder und erwarteten Typen werden wie angegeben angegeben:

# main.py

from pydantic import BaseModel, EmailStr

class Employee(BaseModel):
    name: str
    age: int
    email: EmailStr
    department: str
    employee_id: str

Beachten Sie, dass wir angegeben haben, dass die E-Mail von stammt EmailStr Typ, den Pydantic anstelle eines normalen Python-Strings unterstützt. Dies liegt an der Tatsache Alle gültigen Zeichenfolgen sind möglicherweise keine gültigen E-Mails.

Weil das Employee Die Klasse ist einfach. Fügen wir eine Validierung für die folgenden Felder hinzu:

  • email: sollte eine gültige E-Mail sein. Präzisiere das EmailStr berücksichtigt dies und beim Erstellen von Objekten mit einer ungültigen E-Mail-Adresse treten Fehler auf.
  • employee_id: Muss eine gültige Mitarbeiter-ID sein. Wir werden eine benutzerdefinierte Validierung für dieses Feld implementieren.

Implementierung einer benutzerdefinierten Validierung

Nehmen wir für dieses Beispiel Folgendes an employee_id muss eine Zeichenfolge der Länge 6 sein, die nur alphanumerische Zeichen enthält.

Wir können das nutzen @validator Dekorateur mit employee_id Feld zum Argument und legen Sie fest validate_employee_id Methode wie gezeigt:

# main.py 

from pydantic import BaseModel, EmailStr, validator

...

@validator("employee_id")
    def validate_employee_id(cls, v):
        if not v.isalnum() or len(v) != 6:
            raise ValueError("Employee ID must be exactly 6 alphanumeric characters")
        return v

Nun prüft diese Methode, ob die employee_id ist für die Mitarbeiterobjekte gültig, die wir erstellen möchten.

Zu diesem Zeitpunkt sollte Ihr Skript folgendermaßen aussehen:

# main.py

from pydantic import BaseModel, EmailStr, validator

class Employee(BaseModel):
    name: str
    age: int
    email: EmailStr
    department: str
    employee_id: str

    @validator("employee_id")
     def validate_employee_id(cls, v):
         if not v.isalnum() or len(v) != 6:
             raise ValueError("Employee ID must be exactly 6 alphanumeric characters")
         return v

In der Praxis ist es weit verbreitet, JSON-Antworten von APIs in Datenstrukturen wie Python-Wörterbücher zu analysieren. Angenommen, wir haben eine Datei „employees.json“ (im aktuellen Verzeichnis) mit den folgenden Datensätzen:

# employees.json

[
	{
    	"name": "John Doe",
    	"age": 30,
    	"email": "john.doe@example.com",
    	"department": "Engineering",
    	"employee_id": "EMP001"
	},
	{
    	"name": "Jane Smith",
    	"age": 25,
    	"email": "jane.smith@example.com",
    	"department": "Marketing",
    	"employee_id": "EMP002"
	},
	{
    	"name": "Alice Brown",
    	"age": 35,
    	"email": "invalid-email",
    	"department": "Finance",
    	"employee_id": "EMP0034"
	},
	{
    	"name": "Dave West",
    	"age": 40,
    	"email": "dave.west@example.com",
    	"department": "HR",
    	"employee_id": "EMP005"
	}
]

Wir sehen, dass wir im dritten Datensatz, der „Alice Brown“ entspricht, zwei Felder haben, die ungültig sind: das email und das employee_id:

Pydantic-Tutorial: Datenvalidierung in Python leicht gemachtPydantic-Tutorial: Datenvalidierung in Python leicht gemacht

Weil wir angegeben haben, dass die E-Mail sein muss EmailStr, wird die E-Mail-Kette automatisch validiert. Wir haben auch das hinzugefügt validate_employee_id Klassenmethode, um zu prüfen, ob Objekte eine gültige Mitarbeiter-ID haben.

Fügen wir nun den Code hinzu, um die JSON-Datei zu analysieren und Mitarbeiterobjekte zu erstellen (wir verwenden hierfür das integrierte JSON-Modul). Wir importieren auch die ValidationError Pydantic-Klasse. Im Wesentlichen versuchen wir, Objekte zu erstellen, ValidationError-Ausnahmen zu behandeln, wenn die Datenvalidierung fehlschlägt, und auch die Fehler auszugeben:

# main.py

import json
from pydantic import BaseModel, EmailStr, ValidationError, validator
...

# Load and parse the JSON data
with open("employees.json", "r") as f:
    data = json.load(f)

# Validate each employee record
for record in data:
    try:
        employee = Employee(**record)
        print(f"Valid employee record: {employee.name}")
    except ValidationError as e:
        print(f"Invalid employee record: {record['name']}")
        print(f"Errors: {e.errors()}")

Wenn Sie das Skript ausführen, sollten Sie ein ähnliches Ergebnis sehen:

Output >>>

Valid employee record: John Doe
Valid employee record: Jane Smith
Invalid employee record: Alice Brown
Errors: [{'type': 'value_error', 'loc': ('email',), 'msg': 'value is not a valid email address: The email address is not valid. It must have exactly one @-sign.', 'input': 'invalid-email', 'ctx': {'reason': 'The email address is not valid. It must have exactly one @-sign.'}}, {'type': 'value_error', 'loc': ('employee_id',), 'msg': 'Value error, Employee ID must be exactly 6 alphanumeric characters', 'input': 'EMP0034', 'ctx': {'error': ValueError('Employee ID must be exactly 6 alphanumeric characters')}, 'url': 'https://errors.pydantic.dev/2.6/v/value_error'}]
Valid employee record: Dave West

Wie erwartet ist nur die CD zu „Alice Brown“ verfügbar. nicht ein gültiges Mitarbeiterobjekt. Wenn Sie den relevanten Teil des Ergebnisses vergrößern, können Sie eine detaillierte Meldung sehen, die erklärt, warum email Und employee_id Die Felder sind ungültig.

Hier ist der vollständige Code:

# main.py

import json
from pydantic import BaseModel, EmailStr, ValidationError, validator

class Employee(BaseModel):
    name: str
    age: int
    email: EmailStr
    department: str
    employee_id: str

    @validator("employee_id")
     def validate_employee_id(cls, v):
         if not v.isalnum() or len(v) != 6:
             raise ValueError("Employee ID must be exactly 6 alphanumeric characters")
         return v

# Load and parse the JSON data
with open("employees.json", "r") as f:
    data = json.load(f)

# Validate each employee record
for record in data:
    try:
        employee = Employee(**record)
        print(f"Valid employee record: {employee.name}")
    except ValidationError as e:
        print(f"Invalid employee record: {record['name']}")
        print(f"Errors: {e.errors()}")

Das ist alles für dieses Tutorial! Dies ist ein Einführungs-Tutorial zu Pydantic. Ich hoffe, Sie haben die Grundlagen der Modellierung Ihrer Daten und der Verwendung der integrierten und benutzerdefinierten Validierungen von Pydantic erlernt. Der gesamte in diesem Tutorial verwendete Code befindet sich auf GitHub.

Dann können Sie versuchen, Pydantic in Ihren Python-Projekten zu verwenden und auch die Serialisierungsfunktionen erkunden. Viel Spaß beim Codieren!

Bala Priya C ist ein indischer Entwickler und technischer Autor. Sie arbeitet gerne an der Schnittstelle von Mathematik, Programmierung, Datenwissenschaft und Inhaltserstellung. Zu seinen Interessen- und Fachgebieten gehören DevOps, Datenwissenschaft und Verarbeitung natürlicher Sprache. Sie liebt Lesen, Schreiben, Programmieren und Kaffee! Derzeit arbeitet sie daran, ihr Wissen zu erlernen und mit der Entwickler-Community zu teilen, indem sie Tutorials, Anleitungen, Meinungsbeiträge und mehr erstellt. Bala erstellt außerdem ansprechende Ressourcenübersichten und Programmier-Tutorials.

About the author

smirow

Leave a Comment