Maison >développement back-end >Tutoriel Python >Pydantic • Gérer la validation et la désinfection des données

Pydantic • Gérer la validation et la désinfection des données

PHPz
PHPzoriginal
2024-08-16 18:03:08333parcourir

Pydantic • Dealing with validating and sanitizing data

Depuis que j'ai commencé à programmer, j'ai principalement utilisé des paradigmes structurés et procéduraux, car mes tâches nécessitaient des solutions plus pratiques et directes. Lorsque je travaillais avec l'extraction de données, j'ai dû passer à de nouveaux paradigmes pour obtenir un code plus organisé.

Un exemple de cette nécessité était lors de tâches de scraping lorsque j'avais besoin de capturer des données spécifiques qui étaient initialement d'un type que je savais gérer, mais tout d'un coup, soit elles n'existaient pas, soit apparaissaient sous un type différent lors de la capture. .

Par conséquent, j'ai dû ajouter des blocs if's et try and catch pour vérifier si les données étaient un entier ou une chaîne... découvrant plus tard que rien n'avait été capturé, Aucun , etc. Avec les dictionnaires, j'ai fini par sauvegarder des "données par défaut" sans intérêt dans des situations comme :

data.get(values, 0)

Eh bien, les messages d'erreur déroutants devaient certainement cesser d'apparaître.

C'est comme ça que Python est dynamique. Les types des variables peuvent être modifiés à tout moment, jusqu'à ce que vous ayez besoin de plus de clarté sur les types avec lesquels vous travaillez. Puis soudain, un tas d'informations apparaissent, et maintenant je lis comment je peux gérer la validation des données, avec l'EDI qui m'aide avec des astuces de type et l'intéressante bibliothèque pydantic.

Maintenant, dans des tâches comme la manipulation de données et avec un nouveau paradigme, je peux avoir des objets dont les types seront explicitement déclarés, ainsi qu'une bibliothèque qui permettra de valider ces types. Si quelque chose ne va pas, il sera plus facile de déboguer en voyant les informations d'erreur mieux décrites.


Pydantique

Voici donc la documentation Pydantic. Pour plus de questions, il est toujours bon de consulter.

En gros, comme on le sait déjà, on commence par :

pip install pydantic

Et puis, hypothétiquement, nous voulons capturer les e-mails d'une source qui contient ces e-mails, et la plupart d'entre eux ressemblent à ceci : "xxxx@xxxx.com". Mais parfois, cela peut ressembler à ceci : « xxxx@ » ou « xxxx ». Nous n'avons aucun doute sur le format d'e-mail qui doit être capturé, nous validerons donc cette chaîne d'e-mail avec Pydantic :

from pydantic import BaseModel, EmailStr

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

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

print(consumer)

Remarquez que j'ai utilisé une dépendance facultative, "email-validator", installée avec : pip install pydantic[email]. Lorsque vous exécutez le code, comme nous le savons, l'erreur sera au format email invalide "teste@teste":

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]

Utiliser des dépendances facultatives pour valider les données est intéressant, tout comme créer nos propres validations, et Pydantic le permet via field_validator. Nous savons donc que account_id doit être positif et supérieur à zéro. Si c'est différent, il serait intéressant que Pydantic prévienne qu'il y a eu une exception, une erreur de valeur. Le code serait alors :

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)
$ 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

Maintenant, exécutez le code avec les valeurs correctes :

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)
$ python capture_emails.py
email='teste@teste.com' account_id=12345

N'est-ce pas ?!

J'ai aussi lu quelque chose sur le module natif "dataclasses", qui est un peu plus simple et présente quelques similitudes avec Pydantic. Cependant, Pydantic est meilleur pour gérer des modèles de données plus complexes nécessitant des validations. Les classes de données étaient nativement incluses dans Python, alors que Pydantic ne l'est pas, du moins pas encore.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn