Рубрики
Без рубрики

Анализ и проверка данных в Python с использованием Pydantic

Внедрение типового намека открыло ворота для множества новых новых функций в Python. И данные val … Tagged with Python, начинающие, учебник.

Внедрение типового намека открыло ворота для множества новых новых функций в Python. И проверка данных и анализ стали легче сделать с использованием подсказков типа. Pydantic – это один из таких пакетов, который обеспечивает соблюдение намеков на время выполнения. Это бросает ошибки, позволяющие разработчикам получать недопустимые данные.

Pydantic не только проводит проверку и проверку типов, но и может использоваться для добавления ограничений на свойства и создать пользовательские проверки для переменных Python. Это гарантирует, что типы и ограничения модели были применены и что данные действительны.

Это полезно, особенно когда у нас есть сложные вложенные данные. Нам больше не нужно проанализировать JSON в словарях. Мы можем использовать Pydantic для получения лучшего напечатанного кода, а также добавить валидаторы, обеспечивающие меньшие ошибки.

Важно отметить, что Pydantic отличается от Пирайт в том смысле, что он выполняет проверку данных, а также анализирует входные данные во время выполнения. С другой стороны, Pyright – это статический контроль типа, и это только это делает. Оба инструмента можно использовать вместе, чтобы получить более надежный код Python.

Начальная настройка

Как и во всех вещах Python, мы должны настроить Виртуальная среда Python для любого нового проекта. После этого мы устанавливаем Pydantic с помощью PIP:

python -m pip install pytest

Давайте сначала напишем наш код, используя декоратор данных DataClass. Декоратор DataClass был введен в Python 3.7 и позволяет нам уменьшить код шаблона, такой как метод init. Они также позволяют использовать подсказки типа для наших свойств. Итак, позвольте нам создать класс данных в блоге:

from dataclasses import dataclass
from typing import Tuple

@dataclass
class Blog:
    title: str
    author: str
    categories: Tuple[str,...]

Тупел [str,…] означает кортеж из строки типа, имеющего переменное количество элементов.

Поскольку ни один из типов не отмечен необязательным, мы не должны не назначать ни одному из них. Это означает, что пост в блоге нуждается в названии, авторе и категории. Но если бы мы не назначали им ни одного, не было бы ошибки.

def main():
    blog = Blog(title=None, author=None, categories=None)
    print(blog)

Мы получаем выход:

Blog(title=None, author=None, categories=None)

Нет ошибок, потому что типовые подсказки являются дополнительной функцией, а Python не применяет их. И если бы мы взяли их из конечной точки API, мы бы хотели, чтобы они были проверены сначала, прежде чем выполнить какую -либо логику с данными. И вот где Pydantic входит в картину.

Создание модели пидантики

Вместо этого мы можем заменить атрибут данных DataClass, и если мы запустим его только с этим изменением, мы увидим ошибки проверки.

from pydantic.dataclasses import dataclass

И это бросит ошибки:

Pydantic поддерживает преобразование типа. Поэтому, если мы перенесем значение «2» в поле int, оно будет преобразовано и не вынесет ошибку.

Но классы данных имеют некоторые ограничения. И Pydantic предоставляет класс BaseModel, от которого мы можем продлить. Это дает нам такие функции, как сериализация и поддержка первого класса JSON. Таким образом, мы преобразуем наш код в:

from pydantic import BaseModel
from typing import Tuple

class Blog(BaseModel):
    title: str
    author: str
    categories: Tuple[str,...]

def main():
    blog = Blog(title=None, author=None, categories=None)
    print(blog)

main()

Реализация BaseModel, вероятно, является лучшим способом из -за дополнительных функций. Важно отметить, что мы не должны размещать как декоратор обработки данных, так и простирание от BaseModel, поскольку это не сработает.

Еще одна вещь, которую следует отметить, это то, что BaseModel требуют аргументов ключевых слов, поэтому, хотя это работало бы с DataClass:

blog=Blog("Hello World","Saransh Kataria",("Wisdom","Geek"))

С BaseModel аргументы ключевых слов должны быть явными:

blog=Blog(title="Hello World",author="Saransh Kataria",categories=("Wisdom","Geek"))

Или мы можем использовать ** Kwargs для этого.

Pydant

Мы можем преобразовать модель Pydantic в строку JSON, используя функцию JSON ():

print(blog.json())

# {"title": "Hello World", "author": "Saransh Kataria", "categories": ["Wisdom", "Geek"]}

И мы можем проанализировать JSON в пиддантскую модель, используя функцию parse_raw:

blog = Blog.parse_raw('{"title": "Hello World", "author": "Saransh Kataria", "categories": ["Wisdom", "Geek"]}')
print(blog.title)

# Hello World

И все проверки будут выполнены при выполнении анализа JSON. И если есть какие -либо ошибки во время анализа, для них будет брошено ValidationError с дружественными сообщениями.

Добавление пользовательских подтверждений

Допустим, мы хотим, чтобы авторы могли публиковать только 5 постов по максимуму. Мы добавим поле number_of_posts и навяжем эту проверку. Для этого нам нужно использовать полевую функцию от Pydantic.

Затем мы хотим использовать эту функцию поля, которая принимает первый параметр в качестве значения по умолчанию, которое мы хотим предоставить переменной. Мы можем указать по умолчанию один или использовать «…», чтобы указать, что это необходимое поле. В нашем случае мы указам 0. Остальные параметры могут быть подтверждениями, которые мы хотим указать, которые следует проверить в поле. Мы будем использовать и для указания того, что значение должно быть больше или равно нулю и менее равное 5.

from pydantic import BaseModel, Field

class Blog(BaseModel):
    number_of_posts: int = Field(0,gt=0,lt=5)

def main():
    blog=Blog(number_of_posts=2)
    print(blog.json())

main()

# {"number_of_posts": 2}

Но Если мы запустим это с

blog=Blog(number_of_posts=2)


Traceback (most recent call last):
  File "pydanticdemo.py", line 10, in 
    main()
  File "pydanticdemo.py", line 7, in main
    blog=Blog(number_of_posts=10)
  File "/Users/saranshkataria/pydantic/.venv/lib/python3.7/site-packages/pydantic/main.py", line 400, in __init__
    raise validation_error
pydantic.error_wrappers.ValidationError: 1 validation error for Blog
number_of_posts
  ensure this value is less than 5 (type=value_error.number.not_lt; limit_value=5)

Мы видим ошибку значения с тех пор, как наша проверка не удалась. Если мы хотим наши собственные проверки, кроме встроенных, мы можем импортировать декоратор валидатора. Затем мы можем создать функцию, которую мы хотим использовать для проверки свойства. Декоратор валидатора нуждается в названии свойства, который будет подтвержден, а затем функция получит класс и свойство в качестве параметров.

from pydantic import BaseModel, validator

class Blog(BaseModel):
    name: str

    @validator('name')
    def check_name_length(cls, name):
        if(len(name) < 3):
            raise ValueError('name too short')
        return name

def main():
    blog=Blog(name="SK")
    print(blog.json())

main()

Мы полагаем, что полевое поле должно иметь длину больше 3. А так как в этом случае это не так, мы получаем ошибку:

Traceback (most recent call last):
File "pydanticdemo.py", line 16, in
main()
File "pydanticdemo.py", line 13, in main
blog=Blog(name="SK")
File "/Users/saranshkataria/pydantic/.venv/lib/python3.7/site-packages/pydantic/main.py", line 400, in init
raise validation_error
pydantic.error_wrappers.ValidationError: 1 validation error for Blog
name
name too short (type=value_error)

Заворачивать

И это просто царапает поверхность того, как Pydantic можно использовать для проверки наших классов данных и моделей объектов. Есть гораздо больше, что можно сделать с помощью Pydanta, и вам обязательно следует проверить Документы Узнать больше! Если у вас есть какие -либо вопросы, не стесняйтесь связаться.

Первоначально опубликовано в https://www.wisdomgeek.com 23 марта 2021 года.

Оригинал: “https://dev.to/saranshk/parsing-and-validating-data-in-python-using-pydantic-1j1g”