"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Pydantic • Lidar com validação e higienização de dados

Pydantic • Lidar com validação e higienização de dados

Publicado em 19/08/2024
Navegar:396

Pydantic • Dealing with validating and sanitizing data

Desde que comecei a programar, tenho utilizado principalmente paradigmas estruturados e procedimentais, pois minhas tarefas exigiam soluções mais práticas e diretas. Ao trabalhar com extração de dados, tive que mudar para novos paradigmas para conseguir um código mais organizado.

Um exemplo dessa necessidade foi durante tarefas de scraping, quando eu precisava capturar dados específicos que inicialmente eram de um tipo que eu sabia como lidar, mas de repente eles não existiam ou apareciam em um tipo diferente durante a captura .

Consequentemente, tive que adicionar alguns blocos if's e try and catch para verificar se os dados eram um int ou uma string... descobrindo mais tarde que nada foi capturado, None , etc. Com dicionários, acabei salvando alguns "dados padrão" desinteressantes em situações como:

data.get(values, 0)

Bem, as mensagens de erro confusas certamente tiveram que parar de aparecer.

É assim que o Python é dinâmico. As variáveis ​​podem ter seus tipos alterados sempre que desejar, até que você precise de mais clareza sobre os tipos com os quais está trabalhando. Então, de repente, um monte de informações aparece, e agora estou lendo sobre como posso lidar com a validação de dados, com o IDE me ajudando com dicas de tipo e a interessante biblioteca pydantic.

Agora, em tarefas como manipulação de dados e com um novo paradigma, posso ter objetos que terão seus tipos declarados explicitamente, junto com uma biblioteca que permitirá validar esses tipos. Se algo der errado, será mais fácil depurar vendo as informações de erro melhor descritas.


Pidantico

Então, aqui está a documentação do Pydantic. Para mais dúvidas é sempre bom consultar.

Basicamente, como já sabemos, começamos com:

pip install pydantic

E então, hipoteticamente, queremos capturar e-mails de uma fonte que contenha esses e-mails, e a maioria deles se parece com isto: "[email protected]". Mas às vezes pode ser assim: "xxxx@" ou "xxxx". Não temos dúvidas sobre o formato do email que deve ser capturado, por isso validaremos esta string de email com Pydantic:

from pydantic import BaseModel, EmailStr

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

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

print(consumer)

Observe que usei uma dependência opcional, "email-validator", instalada com: pip install pydantic[email]. Ao executar o código, como sabemos, o erro estará no formato de e-mail inválido "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]

Usar dependências opcionais para validar dados é interessante, assim como criar nossas próprias validações, e o Pydantic permite isso via field_validator. Portanto, sabemos que account_id deve ser positivo e maior que zero. Se for diferente, seria interessante o Pydantic avisar que houve uma exceção, um erro de valor. O código seria então:

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 





$ python capture_emails.py
Traceback (most recent call last):
...
    consumer = Consumer(email="[email protected]", 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

Agora, executando o código com os valores corretos:

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 





$ python capture_emails.py
email='[email protected]' account_id=12345

Certo?!

Também li algo sobre o módulo nativo "dataclasses", que é um pouco mais simples e tem algumas semelhanças com o Pydantic. No entanto, o Pydantic é melhor para lidar com modelos de dados mais complexos que requerem validações. Dataclasses foi incluído nativamente em Python, enquanto Pydantic não – pelo menos ainda não.

Declaração de lançamento Este artigo está reproduzido em: https://dev.to/evertontenorio/pydantic-dealing-with-validating-and-sanitizing-data-594p?1 Se houver alguma violação, entre em contato com [email protected] para excluí-la
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3