Pydantic • Umgang mit der Validierung und Bereinigung von Daten

PHPz
Freigeben: 2024-08-16 18:03:08
Original
325 Leute haben es durchsucht

Pydantic • Dealing with validating and sanitizing data

Seit ich mit dem Programmieren angefangen habe, verwende ich überwiegend strukturierte und prozedurale Paradigmen, da meine Aufgaben praktischere und direktere Lösungen erforderten. Bei der Arbeit mit der Datenextraktion musste ich zu neuen Paradigmen wechseln, um einen besser organisierten Code zu erreichen.

Ein Beispiel für diese Notwendigkeit waren Scraping-Aufgaben, bei denen ich bestimmte Daten erfassen musste, die ursprünglich von einem Typ waren, mit dem ich umgehen konnte, aber dann plötzlich entweder nicht existierten oder während der Erfassung in einem anderen Typ auftraten .

Folglich musste ich einige Blöcke ifs und try and Catch hinzufügen, um zu überprüfen, ob die Daten ein int oder ein String waren ... später entdeckte ich, dass nichts erfasst wurde, None usw. Bei Wörterbüchern habe ich in folgenden Situationen einige uninteressante „Standarddaten“ gespeichert:

data.get(values, 0)
Nach dem Login kopieren

Nun, die verwirrenden Fehlermeldungen mussten auf jeden Fall aufhören zu erscheinen.

So ist Python dynamisch. Der Typ von Variablen kann jederzeit geändert werden, bis Sie mehr Klarheit über die Typen benötigen, mit denen Sie arbeiten. Dann tauchen plötzlich eine Menge Informationen auf und jetzt lese ich darüber, wie ich mit der Datenvalidierung umgehen kann, wobei mir die IDE mit Typhinweisen und der interessanten Pydantic-Bibliothek hilft.

Jetzt kann ich bei Aufgaben wie der Datenmanipulation und mit einem neuen Paradigma Objekte haben, deren Typen explizit deklariert werden, zusammen mit einer Bibliothek, die die Validierung dieser Typen ermöglicht. Wenn etwas schief geht, ist das Debuggen einfacher, da die besser beschriebenen Fehlerinformationen angezeigt werden.


Pydantisch

Hier ist also die Pydantic-Dokumentation. Bei weiteren Fragen ist es immer gut, sich an uns zu wenden.

Grundsätzlich beginnen wir, wie wir bereits wissen, mit:

pip install pydantic
Nach dem Login kopieren

Und dann möchten wir hypothetisch E-Mails von einer Quelle erfassen, die diese E-Mails enthält, und die meisten davon sehen so aus: „xxxx@xxxx.com“. Aber manchmal kann es so kommen: „xxxx@“ oder „xxxx“. Wir haben keine Zweifel an dem E-Mail-Format, das erfasst werden soll, daher werden wir diese E-Mail-Zeichenfolge mit Pydantic validieren:

from pydantic import BaseModel, EmailStr

class Consumer(BaseModel):
    email: EmailStr
    account_id: int

consumer = Consumer(email="teste@teste", account_id=12345)

print(consumer)
Nach dem Login kopieren

Beachten Sie, dass ich eine optionale Abhängigkeit, „email-validator“, verwendet habe, installiert mit: pip install pydantic[email]. Wenn Sie den Code ausführen, wird der Fehler bekanntlich im ungültigen E-Mail-Format „teste@teste“ vorliegen:

Traceback (most recent call last):
  ...
    consumer = Consumer(email="teste@teste", account_id=12345)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  ...: 1 validation error for Consumer
email
  value is not a valid email address: The part after the @-sign is not valid. It should have a period. [type=value_error, input_value='teste@teste', input_type=str]
Nach dem Login kopieren

Die Verwendung optionaler Abhängigkeiten zum Validieren von Daten ist ebenso interessant wie das Erstellen eigener Validierungen, und Pydantic ermöglicht dies über field_validator. Wir wissen also, dass account_id positiv und größer als Null sein muss. Wenn es anders ist, wäre es für Pydantic interessant, zu warnen, dass eine Ausnahme, ein Wertfehler, aufgetreten ist. Der Code wäre dann:

from pydantic import BaseModel, EmailStr, field_validator

class Consumer(BaseModel):
    email: EmailStr
    account_id: int

    @field_validator("account_id")
    def validate_account_id(cls, value):
        """Custom Field Validation"""
        if value <= 0:
            raise ValueError(f"account_id must be positive: {value}")
        return value

consumer = Consumer(email="teste@teste.com", account_id=0)

print(consumer)
Nach dem Login kopieren
$ python capture_emails.py
Traceback (most recent call last):
...
    consumer = Consumer(email="teste@teste.com", account_id=0)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

...: 1 validation error for Consumer
account_id
  Value error, account_id must be positive: 0 [type=value_error, input_value=0, input_type=int]
    For further information visit https://errors.pydantic.dev/2.8/v/value_error
Nach dem Login kopieren

Führen Sie nun den Code mit den richtigen Werten aus:

from pydantic import BaseModel, EmailStr, field_validator

class Consumer(BaseModel):
    email: EmailStr
    account_id: int

    @field_validator("account_id")
    def validate_account_id(cls, value):
        """Custom Field Validation"""
        if value <= 0:
            raise ValueError(f"account_id must be positive: {value}")
        return value

consumer = Consumer(email="teste@teste.com", account_id=12345)

print(consumer)
Nach dem Login kopieren
$ python capture_emails.py
email='teste@teste.com' account_id=12345
Nach dem Login kopieren

Richtig?!

Ich habe auch etwas über das native Modul „dataclasses“ gelesen, das etwas einfacher ist und einige Ähnlichkeiten mit Pydantic aufweist. Allerdings eignet sich Pydantic besser für den Umgang mit komplexeren Datenmodellen, die Validierungen erfordern. Datenklassen waren nativ in Python enthalten, Pydantic jedoch nicht – zumindest noch nicht.

Das obige ist der detaillierte Inhalt vonPydantic • Umgang mit der Validierung und Bereinigung von Daten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage