当前位置:首页 > 文章列表 > 文章 > python教程 > Pydantic:手动验证的终结! ✨

Pydantic:手动验证的终结! ✨

来源:dev.to 2024-11-27 20:19:10 0浏览 收藏

golang学习网今天将给大家带来《Pydantic:手动验证的终结! ✨》,感兴趣的朋友请继续看下去吧!以下内容将会涉及到等等知识点,如果你是正在学习文章或者已经是大佬级别了,都非常欢迎也希望大家都能给我建议评论哈~希望能帮助到大家!

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,以确定哪些字段将使用此验证器,或者通过“*”为每个字段应用验证器。

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

到这里,我们也就讲完了《Pydantic:手动验证的终结! ✨》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

版本声明
本文转载于:dev.to 如有侵犯,请联系study_golang@163.com删除
Linux 发行版中令人困惑的 JRE 和 JDK 包命名Linux 发行版中令人困惑的 JRE 和 JDK 包命名
上一篇
Linux 发行版中令人困惑的 JRE 和 JDK 包命名
Python Socket 响应 HTTP 请求时,如何确保 HTML 文件完整显示?
下一篇
Python Socket 响应 HTTP 请求时,如何确保 HTML 文件完整显示?
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • PubMedQA数据集详解:生物医学问答基准、功能与应用指南
    PubMedQA
    深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
    390次使用
  • H2O EvalGPT:开源LLM大模型评估与排行榜工具
    H2O EvalGPT
    H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
    470次使用
  • LMArena是什么?伯克利AI模型评估平台使用指南与功能解析
    LMArena
    LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
    477次使用
  • 斯坦福HELM:大语言模型Holistic Evaluation整体评估框架详解
    HELM
    深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
    421次使用
  • MMBench详解:多模态大模型基准测试、功能特点与使用指南
    MMBench
    MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
    245次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议 和 隐私政策
返回登录
  • 重置密码