Pydantic:手动验证的终结! ✨

Patricia Arquette
发布: 2024-11-26 00:07:11
原创
894 人浏览过

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-8601UTC 或其他日期格式的字符串作为 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',>



<p>The result will be<br>
</p>

<pre class="brush:php;toolbar:false">Task(id=1, due_date=datetime.datetime(2024, 10, 15, 15, 30), priority=True)
登录后复制

自定义验证

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

输入 import Any
从 pydantic 导入 Field、field_validator、EmailStr、BaseModel

用户类(基础模型):
    id:整数
    用户名:str = Field(pattern=r'^w $')
    电子邮件:EmailStr
    年龄:int = Field(18,ge=14)
    is_active: 布尔 = True
    角色:列表[str]

    # 定义验证器在内部解析“之前”执行
    @field_validator('角色', mode='之前')
    def _validate_roles(cls,值:任意):
        返回 value.split(',') if isinstance(value, str) else value

user = User(id=1, 用户名='john', email='john@example.com', 角色='学生,歌手')
打印(用户)#>



<h2>
  
  
  开源项目
</h2>

<p>有很多由 Pydantic 支持的开源项目。让我们探索其中最好的:</p>

<h3>
  
  
  快速API
</h3>

<p>Pydantic 最突出的用例之一是 FastAPI,这是一个使用 Python 构建 API 的现代 Web 框架。 FastAPI 广泛使用 Pydantic 模型进行请求正文验证、查询参数和响应模式。</p>

登录后复制
  • 来源:https://github.com/fastapi/fastapi
  • 文档:https://fastapi.tiangolo.com

Pydantic: The end of manual validations! ✨

老师

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

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

Pydantic: The end of manual validations! ✨

SQLModel 和 Typer

SQLModelTyper 是 FastAPI 的创建者 Sebastián Ramírez 开发的两个出色的项目。

SQLModel 是一个旨在简化 Python 应用程序中的数据库交互的库。 SQLModel 构建于 SQLAlchemyPydantic 之上,将 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:手动验证的终结! ✨的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板