Стать профессионалом в Pydantic Validators — это все равно, что научиться пользоваться уникальным инструментом, который проверяет правильность наших данных. Pydantic — это своего рода помощник в Python, который известен тем, что обеспечивает правильный и точный вид данных. Когда мы узнаем о валидаторах Pydantic, мы знаем, как очень хорошо использовать этот вспомогательный инструмент. Это означает, что мы понимаем, как устанавливать правила того, как должны выглядеть данные, и ловить ошибки. Чтобы преуспеть в этом, мы должны знать о различных типах данных и о том, как разработать собственные правила их проверки. Как только мы освоим Pydantic Validators, мы сможем сделать наши программы более надежными и надежными.
Метод 1. Освоение валидаторов Pydantic для реальных приложений
Представьте, что мы создаем веб-приложение для ресторана, где клиенты могут размещать заказы онлайн. Чтобы обеспечить точность заказов и предотвратить сбои, мы решили использовать валидаторы Pydantic для проверки входящих данных.
Всякий раз, когда мы начинаем с примера, требующего функций Pydantic, нам нужно сначала установить его пакеты, чтобы включить библиотеку со всеми ее пакетами в зависимости Python. Чтобы внести необходимые зависимости в проект, воспользуемся следующими командами:Загрузка рекламы
!pip install pydantic
from typing import List
from pydantic import BaseModel, conlist, field_validator
Теперь, когда мы уже установили необходимые пакеты, давайте сделаем первый шаг для реализации примера, который заключается в определении модели данных с использованием BaseModel от Pydantic. Поскольку мы работаем над приложением онлайн-заказа в ресторане, в нашем случае модель имеет атрибут, соответствующий требованиям приложения доставки. В каждом заказе указывается имя клиента, товары, которые он хочет заказать, а также любые особые примечания. Начнем с создания класса Python, который наследуется от BaseModel Pydantic, и укажем нужные нам поля:
В этой модели мы теперь определяем типы данных для каждого из этих атрибутов, где customer_name — обязательная строка, items — список строк (требуется хотя бы один элемент), а Special_notes — необязательная строка.
class Order(BaseModel):
customer_name: str
items: List[str]
special_notes: str = None
Обычно после определения модели мы создаем экземпляр этой модели для ее проверки, а затем получаем доступ к ее атрибутам объекта. Тем не менее, иногда нам необходимо применить некоторые условия к атрибутам модели данных перед созданием экземпляра ее объекта. Этот тип проверки известен как пользовательская проверка. Предположим, что для пользовательской проверки мы хотим убедиться, что имя клиента имеет длину не менее трех символов и что каждый элемент в заказе не пуст. Для этого мы можем использовать валидаторы Pydantic.
@field_validator(‘customer_name’)
def validate_customer_name(cls, value):
if len(value) < 3:
raise ValueError(«Customer name must be at least 3 characters long»)
return value
Эти валидаторы гарантируют, что имя клиента достаточно длинное и что каждый элемент имеет осмысленное имя.
После применения пользовательских проверок с использованием валидаторов с установленной моделью данных и валидаторов мы теперь можем использовать их для проверки входящих заказов в нашем веб-приложении.
order_data = {
«customer_name»: «John»,
«items»: [«Burger», «Fries»],
«special_notes»: «No onions»
}
try:
order = Order(**order_data)
print(«Order is valid:», order)
except ValueError as e:
print(«Invalid order:», str(e))
Когда мы создаем экземпляр «Заказ», используя предоставленные данные, Pydantic автоматически запускает определенные нами валидаторы. Если какой-либо из валидаторов выдаст ошибку ValueError, данные недействительны в соответствии с нашими правилами.
Вот код примера, который мы упоминали ранее, с его выводом:
!pip install pydantic
from typing import List
from pydantic import BaseModel, conlist, field_validator
class Order(BaseModel):
customer_name: str
items: List[str]
special_notes: str = None
@field_validator(‘customer_name’)
def validate_customer_name(cls, value):
if len(value) < 3:
raise ValueError(«Customer name must be at least 3 characters long»)
return value
@field_validator(‘items’)
def validate_item(cls, value):
if not value:
raise ValueError(«Item names cannot be empty»)
return value
order_data = {
«customer_name»: «John»,
«items»: [«Burger», «Fries»],
«special_notes»: «No onions»
}
try:
order = Order(**order_data)
print(«Order is valid:», order)
except ValueError as e:
print(«Invalid order:», str(e))
Освоив валидаторы Pydantic в этом примере, мы обеспечили точность заказов, размещенных через онлайн-платформу нашего ресторана, и приобрели ценные навыки проверки данных, которые можно применять в различных контекстах. Независимо от того, работаем ли мы над веб-приложениями, API или любым другим программным обеспечением, работающим с данными, валидаторы Pydantic могут стать мощным инструментом в нашем наборе инструментов разработчика.
Метод 2: расширенные параметры проверки в Pydantic
По мере того, как мы освоимся с валидаторами Pydantic, мы сможем изучить расширенные функции, такие как функции предварительной и постобработки, работу со сложными структурами данных и использование встроенных валидаторов Pydantic.
Например, мы могли бы добавить валидатор, который проверяет, не превышает ли общая сумма заказа определенную сумму, или создать вложенные модели для обработки более сложных структур, таких как адреса доставки.
Для валидатора общей стоимости заказа:
В ранее упомянутом примере мы хотим гарантировать, что общая стоимость заказа не превышает определенный предел. Для этого мы можем использовать валидатор для проверки суммы затрат каждого элемента.
class Order(BaseModel):
customer_name: str
items: List[str]
special_notes: str = None
@field_validator(‘items’)
def validate_order_cost(cls, value, values):
item_prices = {«Burger»: 5, «Fries»: 2, «Soda»: 1} # Sample item prices
total_cost = sum(item_prices[item] for item in value)
if total_cost > 20:
raise ValueError(«Order total cannot exceed $20»)
return value
Этот валидатор вычисляет общую стоимость заказа на основе заранее определенных цен на товары и выдает ошибку, если она превышает лимит.
Что касается предыдущего примера, вложенных моделей адресов, предположим, что мы хотим обрабатывать разные адреса доставки; мы можем создать вложенную модель адресов и проверить ее компоненты.
class Address(BaseModel):
street: str
city: str
state: str
zip_code: str
class Order(BaseModel):
customer_name: str
items: conlist(str, min_items=1)
special_notes: str = None
delivery_address: Address
Включая Delivery_address в качестве экземпляра модели «Адрес», мы гарантируем, что данные адреса являются полными и соответствуют требуемой структуре.
Для расширенной предварительной обработки Pydantic позволяет нам выполнять расширенную предварительную обработку с использованием методов класса. Например, мы можем автоматически писать имя клиента с заглавной буквы и форматировать специальные примечания.
class Order(BaseModel):
customer_name: str
items: List[str]
special_notes: str = None
@classmethod
def pre_process(cls, data):
data[‘customer_name’] = data[‘customer_name’].capitalize()
if ‘special_notes’ in data:
data[‘special_notes’] = data[‘special_notes’].strip()
return data
Этот метод pre_process изменяет данные перед проверкой, обеспечивая согласованность и улучшая взаимодействие с пользователем.
Вот полный код с фрагментом вывода наблюдения. Этот код можно скопировать в любой компилятор Python, чтобы увидеть результат:
!pip install pydantic
from typing import List
from pydantic import BaseModel, conlist, field_validator
# Nested model for delivery address
class Address(BaseModel):
street: str
city: str
state: str
zip_code: str
# Order model with advanced validation and preprocessing
class Order(BaseModel):
customer_name: str
items: list[str]
special_notes: str = None
delivery_address: Address
@field_validator(‘items’)
def validate_order_cost(cls, value, values):
item_prices = {«Burger»: 5, «Fries»: 2, «Soda»: 1}
total_cost = sum(item_prices[item] for item in value)
if total_cost > 20:
raise ValueError(«Order total cannot exceed $20»)
return value
@classmethod
def pre_process(cls, data):
data[‘customer_name’] = data[‘customer_name’].capitalize()
if ‘special_notes’ in data:
data[‘special_notes’] = data[‘special_notes’].strip()
return data
order_data = {
«customer_name»: «alien»,
«items»: [«Burger», «Fries», «Soda»],
«special_notes»: » No onions «,
«delivery_address»: {
«street»: «123 Main St»,
«city»: «pwd»,
«state»: «CA»,
«zip_code»: «12345»
}
}
# Process order
try:
order_data = Order.pre_process(order_data)
order = Order(**order_data)
print(«Order is valid:», order)
except ValueError as e:
print(«Invalid order:», str(e))
Освоение валидаторов Pydantic, выходящее за рамки основ, помогает нам уверенно решать сложные сценарии проверки. Библиотека может обрабатывать сложные структуры, интегрировать расширенную предварительную обработку и реализовывать настраиваемые валидаторы, что позволяет нам создавать мощные приложения, поддерживающие целостность данных и удовлетворенность пользователей. Экспериментируя с вложенными моделями, более подробными правилами проверки и расширенными вариантами проверки данных, мы улучшили свой опыт в использовании Pydantic в полной мере. Эти навыки улучшают наш текущий проект и позволяют нам работать с ценным набором навыков, применимым к различным областям разработки.
Заключение
Приобретение навыков работы с валидаторами Pydantic помогает нам быть уверенными в том, что наши данные верны и заслуживают доверия. Как и в примере с рестораном, мы можем использовать Pydantic, чтобы установить правила того, как должны выглядеть данные, и выявить ошибки. Мы можем создавать лучшие программы, изучая модели, пользовательские правила и расширенные функции. Итак, имеем ли мы дело с онлайн-заказами или какими-либо данными, Pydantic заботится о том, чтобы все работало правильно и пользователи были удовлетворены.