Перейти к содержанию

Пидантик

CI Coverage
pypi CondaForge downloads
license

.

Pydantic — наиболее широко используемая библиотека проверки данных для Python.

Быстрый и расширяемый, Pydantic прекрасно взаимодействует с вашими линтерами/IDE/мозгом. Определите, какими должны быть данные в чистом каноническом Python 3.8+; проверьте это с помощью Pydantic.

!!! успех «Миграция на Pydantic V2» Используете Pydantic V1? См. Руководство по миграции для получения примечаний по обновлению ваших приложений до Pydantic V2!

from datetime import datetime
from typing import Tuple

from pydantic import BaseModel


class Delivery(BaseModel):
    timestamp: datetime
    dimensions: Tuple[int, int]


m = Delivery(timestamp='2020-01-02T03:04:05Z', dimensions=['10', '20'])
print(repr(m.timestamp))
#> datetime.datetime(2020, 1, 2, 3, 4, 5, tzinfo=TzInfo(UTC))
print(m.dimensions)
#> (10, 20)

!!! вопрос «Почему Пидантик назван именно так?»

The name "Pydantic" is a portmanteau of "Py" and "pedantic." The "Py" part indicates that the library is associated with Python, and
"pedantic" refers to the library's meticulous approach to data validation and type enforcement.

Combining these elements, "Pydantic" describes our Python library that provides detail-oriented, rigorous data validation.

We’re aware of the irony that Pydantic V1 was not strict in its validation, so if we're being pedantic, "Pydantic" was a misnomer until V2 😉.

Зачем использовать Пидантик?

  • На основе подсказок типов — в Pydantic проверка и сериализация схемы контролируются аннотациями типов; меньше изучения, меньше кода для написания и интеграция с вашей IDE и инструментами статического анализа. Узнать больше…
  • Скорость — основная логика проверки Pydantic написана на Rust. В результате Pydantic входит в число самых быстрых библиотек проверки данных для Python. Узнать больше…
  • Схема JSON. Модели Pydantic могут создавать схему JSON, что позволяет легко интегрироваться с другими инструментами. Узнать больше…
  • Строгий и слабый режим. Pydantic может работать либо в режиме strict=True (где данные не преобразуются), либо в режиме strict=False, где Pydantic пытается привести данные к правильному типу, где это необходимо. Узнать больше…
  • Классы данных, TypedDicts и многое другое. Pydantic поддерживает проверку многих типов стандартных библиотек, включая dataclass и TypedDict. Узнать больше…
  • Настройка. Pydantic позволяет настраиваемым валидаторам и сериализаторам изменять способ обработки данных множеством эффективных способов. Узнать больше…
  • Экосистема — около 8000 пакетов PyPI используют Pydantic, включая такие популярные библиотеки, как FastAPI, Huggingface, Django Ninja, SQLModel и LangChain. Узнать больше…
  • Проверено в боях — Pydantic загружается более 70 миллионов раз в месяц и используется всеми компаниями FAANG и 20 из 25 крупнейших компаний на NASDAQ. Если вы пытаетесь что-то сделать с помощью Pydantic, возможно, это уже сделал кто-то другой. Узнать больше…

Установить Pydantic очень просто: pip install pydantic

Пидантические примеры

Чтобы увидеть Pydantic в работе, давайте начнем с простого примера создания пользовательского класса, наследуемого от BaseModel:

from datetime import datetime

from pydantic import BaseModel, PositiveInt


class User(BaseModel):
    id: int  # (1)!
    name: str = 'John Doe'  # (2)!
    signup_ts: datetime | None  # (3)!
    tastes: dict[str, PositiveInt]  # (4)!


external_data = {
    'id': 123,
    'signup_ts': '2019-06-01 12:22',  # (5)!
    'tastes': {
        'wine': 9,
        b'cheese': 7,  # (6)!
        'cabbage': '1',  # (7)!
    },
}

user = User(**external_data)  # (8)!

print(user.id)  # (9)!
#> 123
print(user.model_dump())  # (10)!
"""
{
    'id': 123,
    'name': 'John Doe',
    'signup_ts': datetime.datetime(2019, 6, 1, 12, 22),
    'tastes': {'wine': 9, 'cheese': 7, 'cabbage': 1},
}
"""
  1. идентификатор имеет тип int; объявление только для аннотаций сообщает Pydantic, что это поле является обязательным. Строки, байты или числа с плавающей запятой, если это возможно, будут преобразованы в целые числа; в противном случае будет возбуждено исключение.
  2. имя — строка; поскольку он имеет значение по умолчанию, он не требуется.
  3. Signup_ts — это поле даты и времени, которое является обязательным, но можно указать значение None; Pydantic будет обрабатывать либо временную метку unix int (например, 1496498400), либо строку, представляющую дату и время.
  4. вкусы — это словарь со строковыми ключами и положительными целочисленными значениями. Тип PositiveInt является сокращением для Annotated[int, annotated_types.Gt(0)] .
  5. Входные данные здесь представляют собой дату и время в формате ISO8601, Pydantic преобразует их в объект даты и времени.
  6. Ключевым моментом здесь являются байты, но Pydantic позаботится о том, чтобы преобразовать их в строку.
  7. Аналогично, Pydantic преобразует строку «1» к целому числу 1.
  8. Здесь мы создаем экземпляр пользователя, передавая наши внешние данные пользователю в качестве аргументов ключевого слова.
  9. Мы можем получить доступ к полям как атрибутам модели.
  10. Мы можем преобразовать модель в словарь с помощью model_dump().

Если проверка не удалась, Pydantic выдаст ошибку с указанием того, что было не так:

# continuing the above example...

from pydantic import ValidationError


class User(BaseModel):
    id: int
    name: str = 'John Doe'
    signup_ts: datetime | None
    tastes: dict[str, PositiveInt]


external_data = {'id': 'not an int', 'tastes': {}}  # (1)!

try:
    User(**external_data)  # (2)!
except ValidationError as e:
    print(e.errors())
    """
    [
        {
            'type': 'int_parsing',
            'loc': ('id',),
            'msg': 'Input should be a valid integer, unable to parse string as an integer',
            'input': 'not an int',
            'url': 'https://errors.pydantic.dev/2/v/int_parsing',
        },
        {
            'type': 'missing',
            'loc': ('signup_ts',),
            'msg': 'Field required',
            'input': {'id': 'not an int', 'tastes': {}},
            'url': 'https://errors.pydantic.dev/2/v/missing',
        },
    ]
    """
  1. Входные данные здесь неверны — id не является допустимым целым числом, а Signup_ts отсутствует.
  2. Пользователь(...) вызовет ValidationError со списком ошибок.

Кто использует Пидантик?

Сотни организаций и пакетов используют Pydantic. Некоторые из известных компаний и организаций по всему миру, использующих Pydantic, включают:

Более полный список проектов с открытым исходным кодом, использующих Pydantic, см. список зависимостей на github, или вы можете найти несколько замечательных проектов, использующих Pydantic, в Awesome-pydantic.


本文总阅读量