Python Pydantic使用指南

10,932 阅读5分钟

Pydantic是一个基于Python的数据验证和设置管理库。通过使用Pydantic,你可以轻松地为你的数据模型设置类型注解,以确保数据的有效性和正确性。本教程将介绍如何使用Pydantic,并提供一些实际的示例来帮助你快速上手。

目录

  1. 安装Pydantic
  2. 基本用法
  3. 高级用法
  4. 自定义验证
  5. 总结

1. 安装Pydantic

要安装Pydantic,你可以使用pip:

pip install pydantic

安装完成后,你就可以开始使用Pydantic了。

2. 基本用法

让我们从一个简单的例子开始。假设我们正在开发一个电影票预订系统,需要定义一个用户模型。我们可以使用Pydantic的BaseModel类来定义该模型:

from pydantic import BaseModel

class User(BaseModel):
    name: str
    age: int
    email: str

现在我们有了一个用户模型,我们可以创建一个用户实例:

user = User(name="Alice", age=30, email="alice@example.com")

如果我们尝试使用无效的数据创建用户,Pydantic将引发一个异常:

user = User(name="Alice", age="30", email="alice@example.com")  # 错误:年龄应该是int类型

这确保了我们的数据总是符合预期的类型。

3. 高级用法

Pydantic还提供了一些高级功能,如默认值、可选字段和自定义数据类型。让我们扩展我们的用户模型以包含这些功能:

from typing import Optional
from pydantic import BaseModel, EmailStr

class User(BaseModel):
    name: str
    age: int
    email: EmailStr
    phone: Optional[str] = None

在这个新模型中,我们:

  • email字段更改为EmailStr类型,以便Pydantic对电子邮件进行验证。
  • 添加了一个可选的phone字段,它具有一个默认值None。这意味着我们在创建用户时可以忽略该字段。

现在我们可以创建一个包含电子邮件验证和可选电话号码的用户:

user = User(name="Alice", age=30, email="alice@example.com")  # 有效
user = User(name="Alice", age=30, email="invalid_email")  # 错误:无效的电子邮件

4. 自定义验证

除了内置的验证器,我们还可以为我们的模型定义自定义验证器。假设我们想要确保用户年龄在18岁以上。我们可以使用@validator装饰器创建一个自定义验证器:

from pydantic import BaseModel, EmailStr, validator

class User(BaseModel):
    name: str
    age: int
    email: EmailStr
    phone: Optional[str] = None

    @validator("age")
    def check_age(cls, age):
        if age < 18:
            raise ValueError("用户年龄必须大于18岁")
        return age

现在,如果我们尝试创建一个未满18岁的用户,我们将得到一个错误:

user = User(name="Alice", age=17, email="alice@example.com")  # 错误:用户年龄必须大于18岁

5. Field对象

Field对象是Pydantic中的一个重要功能,它用于在数据模型中定义字段的附加信息和约束。例如,你可以使用Field来定义字段的描述、默认值、取值范围等。

为什么要使用Field对象?

在某些情况下,仅使用类型注解可能无法满足我们的需求。例如,我们可能需要对字段的取值范围进行限制,或者为字段添加描述信息。这时,我们可以使用Field对象来实现这些需求。

如何使用Field对象?

要使用Field对象,首先需要从pydantic中导入它:

from pydantic import Field

然后,在数据模型中,你可以使用Field函数为字段添加额外的信息和约束。例如,让我们考虑一个商品模型,其中商品价格必须在1到1000之间,且需要一个描述信息:

from pydantic import BaseModel, Field

class Product(BaseModel):
    name: str
    price: float = Field(..., description="商品价格", gt=1, lt=1000)

在这个例子中,我们为price字段添加了Field对象,其中:

  • ...表示该字段是必填项。
  • description定义了字段的描述信息。
  • gt表示字段的取值必须大于1。
  • lt表示字段的取值必须小于1000。

现在,当我们尝试使用无效的价格创建商品时,Pydantic将会引发一个异常:

product = Product(name="Laptop", price=0)  # 错误:价格必须大于1

Field对象的参数

Field函数提供了许多参数来定制字段的行为。以下是一些常用的参数:

  • default:定义字段的默认值。如果未提供该值,则默认为None
  • alias:定义字段的别名。这在处理不符合Python变量命名规则的字段名时非常有用(例如,包含空格或连字符的字段名)。
  • title:定义字段的标题。这在生成文档时非常有用。
  • description:定义字段的描述信息。这在生成文档时非常有用。
  • min_lengthmax_length:针对字符串类型的字段定义最小和最大长度限制。
  • gtgeltle:针对数值类型的字段定义大于(gt)、大于等于(ge)、小于(lt)和小于等于(le)的限制。

更多关于Field的参数和用法,你可以参考官方文档:pydantic-docs.helpmanual.io/usage/schem…

Field对象为我们提供了更多的控制和自定义字段的能力。使用Field可以让我们更精确地定义数据模型的约束,从而确保数据的有效性和一致性。

6. 总结

在本教程中,我们介绍了如何使用Pydantic库进行数据验证和设置管理。我们通过创建一个用户模型来演示了基本用法、高级用法和自定义验证。现在你应该有足够的知识来开始使用Pydantic来简化你的Python项目中的数据验证和设置管理任务。