讲师中心 微信公众号
AI工具推荐 视频效率加速

Pydantic:手动验证的终结! ✨

雨伟同学_7175

雨伟同学_7175

发布时间:2024-11-23 20:21:09

|

890人浏览过

|

来源于dev.to

转载

pydantic 是一个 python 数据验证和设置管理库。它使用 python 类型提示来验证和解析数据,确保您的代码能够处理正确结构化和类型化的数据。通过利用 python 的类似数据类的模型结构,pydantic 可以轻松定义复杂数据的模式,并以干净的 python 方式自动验证和序列化/反序列化数据。让我们来探讨一下主要功能:

数据验证

使用 python 的类型提示根据模式自动验证输入数据。

from pydantic import basemodel, validationerror

class user(basemodel):
    id: int
    name: str
    email: str

# valid input
user = user(id=1, name="john doe", email="john@example.com")
print(user)

# invalid input
try:
    user = user(id="not-an-integer", name="jane", email="jane@example.com")
except validationerror as err:
    print(err)

每当你想定义数据模型时,请使用 pydantic.basemodel!

功能验证

pydantic 提供了强大的工具,不仅可以验证数据模型,还可以验证函数的输入和输出。这是使用 @validate_call 装饰器实现的,允许您对函数参数和返回值强制执行严格的数据验证。如果提供的参数或返回类型与预期类型不匹配,则会引发 validationerror。

from pydantic import validate_call

@validate_call
def greet(name: str, age: int) -> str:
    return f"hello {name}, you are {age} years old."

# valid input
print(greet("alice", 30))  # output: hello alice, you are 30 years old.

# invalid input
try:
    greet("bob", "not-a-number")
except exception as e:
    print(e)

通过在 @validate_call 中启用 validate_return 标志,pydantic 还将根据其带注释的返回类型验证函数的返回值。这可确保函数遵循预期的输出模式。

from pydantic import validate_call

@validate_call(validate_return=true)
def calculate_square(number: int) -> int:
    return number ** 2  # correct return type

# valid input and return
print(calculate_square(4))  # output: 16

# invalid return value
@validate_call(validate_return=true)
def broken_square(number: int) -> int:
    return str(number ** 2)  # incorrect return type

try:
    broken_square(4)
except exception as e:
    print(e)

解析

pydantic 可以将复杂的嵌套结构(包括 json 数据)解析为模型对象。

from pydantic import basemodel
from typing import list

class item(basemodel):
    name: str
    price: float

class order(basemodel):
    items: list[item]
    total: float

# json-like data
data = {
    "items": [
        {"name": "apple", "price": 1.2},
        {"name": "banana", "price": 0.8}
    ],
    "total": 2.0
}

order = order(**data) 
print(order) # items=[item(name='apple', price=1.2), item(name='banana', price=0.8)] total=2.0

序列化和反序列化

pydantic 模型可以序列化为 json 或字典并重构回来。

from pydantic import basemodel

class user(basemodel):
    id: int
    name: str
    email: str

# create a model instance
user = user(id=1, name="alice", email="alice@example.com")

# serialize to dictionary and json
user_dict = user.model_dump()
user_json = user.model_dump(mode='json')

print("dictionary:", user_dict)
print("json:", user_json)

# deserialize back to the model
new_user = user.model_validate(user_json)
print("parsed user:", new_user)

灵活的验证

数据验证不是强制类型验证。例如,如果您定义一个模型,其中 id、due_date 和优先级字段分别为 int、bool 和 datetime 类型,则可以传递:

  • 数字字符串作为id
  • iso-8601、utc 或其他日期格式的字符串作为 due_date
  • 'yes'/'no'、'on'/'off'、'true'/'false'、1/0 等作为优先级
from sensei import apimodel
from datetime import datetime


class task(apimodel):
    id: int
    due_date: datetime
    priority: bool


task = task(due_date='2024-10-15t15:30:00', id="1", priority="yes")
print(task)

结果将是

task(id=1, due_date=datetime.datetime(2024, 10, 15, 15, 30), priority=true)

自定义验证

您还可以使用验证器在模型中定义自定义验证逻辑。它们允许您应用更复杂的验证规则,这些规则无法使用内置类型或字段约束轻松表达。验证器是通过 field_validator 装饰器或 field 对象定义的。您可以将一个或多个字段名称传递给 field_validator,以确定哪些字段将使用此验证器,或者通过“*”为每个字段应用验证器。

Github Webhook Architect
Github Webhook Architect

指导用户配置OpenClaw、Nginx和GitHub Actions,以建立安全、自动化的GitHub集成流水线。

下载
from typing import Any
from pydantic import Field, field_validator, EmailStr, BaseModel

class User(BaseModel):
    id: int
    username: str = Field(pattern=r'^\w+$')
    email: EmailStr
    age: int = Field(18, ge=14)
    is_active: bool = True
    roles: list[str]

    # Define validator executed 'before' internal parsing
    @field_validator('roles', mode='before')
    def _validate_roles(cls, value: Any):
        return value.split(',') if isinstance(value, str) else value

user = User(id=1, username='john', email='john@example.com', roles='student,singer')
print(user) # id=1 username='john' email='john@example.com' age=18 is_active=True roles=['student', 'singer']

开源项目

有很多由 pydantic 支持的开源项目。让我们探索其中最好的:

快速api

pydantic 最突出的用例之一是 fastapi,这是一个使用 python 构建 api 的现代 web 框架。 fastapi 广泛使用 pydantic 模型进行请求正文验证、查询参数和响应模式。

  • 来源:https://github.com/fastapi/fastapi
  • 文档:https://fastapi.tiangolo.com

Pydantic:手动验证的终结! ✨

老师

fastapi 是为构建 api 而设计的,而 sensei 则是为快速、轻松地包装这些 api 而设计的。由 sensei 提供支持的 api 客户端可确保用户获得相关的数据模型,并且不会出现令人困惑的错误。

  • 来源:https://github.com/crocofactory/sensei
  • 文档:https://sensei.crocofactory.dev

Pydantic:手动验证的终结! ✨

sqlmodel 和 typer

sqlmodel 和 typer 是 fastapi 的创建者 sebastián ramírez 开发的两个出色的项目。

sqlmodel 是一个旨在简化 python 应用程序中的数据库交互的库。 sqlmodel 构建于 sqlalchemy 和 pydantic 之上,将 orm 的强大功能与数据验证和序列化的便利性结合在一起。

  • 来源:https://github.com/fastapi/sqlmodel
  • 文档:https://sqlmodel.tiangolo.com

typer 是一个使用 python 创建命令行界面 (cli) 应用程序的框架。它通过使用 python 的类型提示自动生成用户友好的 cli 命令和帮助文本来简化流程。

  • 来源:https://github.com/fastapi/typer
  • 文档:https://typer.tiangolo.com

热门AI工具

更多
咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

1975

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

2682

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

936

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

2999

2025.09.10

Python FastAPI异步API开发_Python怎么用FastAPI构建异步API
Python FastAPI异步API开发_Python怎么用FastAPI构建异步API

Python FastAPI 异步开发利用 async/await 关键字,通过定义异步视图函数、使用异步数据库库 (如 databases)、异步 HTTP 客户端 (如 httpx),并结合后台任务队列(如 Celery)和异步依赖项,实现高效的 I/O 密集型 API,显著提升吞吐量和响应速度,尤其适用于处理数据库查询、网络请求等耗时操作,无需阻塞主线程。

99

2025.12.22

Python 微服务架构与 FastAPI 框架
Python 微服务架构与 FastAPI 框架

本专题系统讲解 Python 微服务架构设计与 FastAPI 框架应用,涵盖 FastAPI 的快速开发、路由与依赖注入、数据模型验证、API 文档自动生成、OAuth2 与 JWT 身份验证、异步支持、部署与扩展等。通过实际案例,帮助学习者掌握 使用 FastAPI 构建高效、可扩展的微服务应用,提高服务响应速度与系统可维护性。

514

2026.02.06

Python Web框架FastAPI 全栈开发教程合集
Python Web框架FastAPI 全栈开发教程合集

以 FastAPI 为核心,讲解现代 Python Web API 的高效开发方式,涵盖路由定义与路径参数/查询参数/请求体绑定、Pydantic 模型的数据校验与序列化、依赖注入(Depends)系统的分层设计、中间件与 CORS 配置、OAuth2 + JWT 认证流程、后台任务(BackgroundTasks)、WebSocket 实时通信、SQLAlchemy 异步 ORM 集成、自动生成 OpenAPI/Swagger 交互文

476

2026.05.09

Python FastAPI异步微服务与高性能接口设计
Python FastAPI异步微服务与高性能接口设计

本专题聚焦 Python FastAPI 框架在高性能接口与微服务开发中的应用,讲解异步请求处理、依赖注入机制、路由设计、数据库异步操作以及接口性能优化策略。结合实际项目案例,帮助开发者构建高并发、低延迟的现代化后端服务架构。

399

2026.06.16

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

60

2026.09.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn