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 类型,则可以传递:
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>
FastAPI 是为构建 API 而设计的,而 Sensei 则是为快速、轻松地包装这些 API 而设计的。由 Sensei 提供支持的 API 客户端可确保用户获得相关的数据模型,并且不会出现令人困惑的错误。
SQLModel 和 Typer 是 FastAPI 的创建者 Sebastián Ramírez 开发的两个出色的项目。
SQLModel 是一个旨在简化 Python 应用程序中的数据库交互的库。 SQLModel 构建于 SQLAlchemy 和 Pydantic 之上,将 ORM 的强大功能与数据验证和序列化的便利性结合在一起。
Typer 是一个使用 Python 创建命令行界面 (CLI) 应用程序的框架。它通过使用 Python 的类型提示自动生成用户友好的 CLI 命令和帮助文本来简化流程。
以上是Pydantic:手动验证的终结! ✨的详细内容。更多信息请关注PHP中文网其他相关文章!