Python中,from pydantic import BaseModel的理解

1、from pydantic import BaseModel,经常可以看到这个写法,pydantic这个库是用来处理什么问题的?另外BaseModel又有什么作用?


Pydantic
是一个用于数据验证和设置管理的 Python 库。它的主要作用是简化数据的验证、转换和管理,特别是在需要处理和验证外部输入(比如 JSON 请求体、文件上传、环境变量等)时。

它结合了数据验证和类型注解,提供了清晰和强类型的数据模型。

Pydantic 的作用:

  1. 数据验证:它可以自动验证传入数据是否符合预定的类型和格式。例如,可以用它来验证 JSON 请求中字段的类型、范围、格式等是否符合要求。

  2. 数据转换:除了验证,Pydantic 还可以将输入数据转换成所需的类型。例如,它会将字符串类型的日期转换成 Python 的 datetime 类型,或者将字符串表示的数字转换成整型等。

  3. 清晰的模型定义:通过继承 BaseModel 类,可以为数据模型提供清晰的定义,使代码更加规范和易于维护。

  4. 错误处理:当数据验证失败时,Pydantic 会抛出详细的错误信息,方便你快速定位问题。

BaseModel 的作用:

BaseModel 是 Pydantic 中的一个基类,所有的模型都需要继承它。它的主要作用是提供一些基本功能,如数据验证、序列化、数据转换等。

  1. 字段验证:你可以在模型中定义字段,并且为每个字段指定类型和验证规则。比如,某个字段必须是整数,或者一个字符串的长度不能超过指定的值。

  2. 数据实例化:通过继承 BaseModel,你可以轻松创建一个数据实例,自动对传入的数据进行验证。例如,Pydantic 会确保你创建的实例中字段的值类型正确。

  3. 模型序列化与反序列化:Pydantic 提供了 .dict().json() 方法,方便你将模型对象转换成字典或 JSON 格式进行存储或传输。你也可以通过 .parse_obj() 方法将外部数据(如字典或 JSON)转换成模型实例。

例子:

from pydantic import BaseModel

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

# 创建实例
user = User(name="John", age=30, email="john.doe@example.com")

# 自动验证
print(user.name)  # "John"
print(user.age)   # 30
print(user.email) # "john.doe@example.com"

# 转换成字典
print(user.dict())  # {'name': 'John', 'age': 30, 'email': 'john.doe@example.com'}

在这个例子中,User 继承了 BaseModel,并且定义了三个字段:nameageemail。Pydantic 会自动验证这些字段的数据类型。

当我们实例化 User 时,它会验证输入数据的类型是否符合模型定义。

 

2、将1中提到的pydantic和BaseModel每个作用,都举出具体的例子来说明

下面是1中提到的 Pydantic 和 BaseModel 每个作用,提供具体的代码示例来更详细地说明。

1. 数据验证

Pydantic 会自动验证数据是否符合指定的类型、范围等规则。验证失败时,会抛出 ValidationError 错误,帮助你快速定位问题。

例子:

from pydantic import BaseModel, ValidationError

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

try:
    # 验证失败,age 应该是整数,但传入了一个字符串
    user = User(name="John", age="thirty", email="john.doe@example.com")
except ValidationError as e:
    print(e)

输出:

1 validation error for User
age
  value is not a valid integer (type=type_error.integer)

这里,Pydantic 会验证 age 是否为整数。如果传入的数据类型不符合要求,它会抛出详细的错误信息。

 

2. 数据转换

Pydantic 会自动转换数据类型,如果字段的数据类型与定义不符,它会尽量进行类型转换。

例子:

from pydantic import BaseModel

class Product(BaseModel):
    price: float
    quantity: int

# 输入为字符串形式的数字,Pydantic 会自动转换为对应类型
product = Product(price="19.99", quantity="10")
print(product)

输出:

price=19.99 quantity=10

虽然输入的 pricequantity 是字符串,Pydantic 会自动将它们转换为 floatint 类型。

3. 清晰的模型定义

通过继承 BaseModel,我们能够定义清晰的数据模型,并且给每个字段指定数据类型。这样代码更加规范,且易于理解和维护。

例子:

from pydantic import BaseModel
from typing import List

class Book(BaseModel):
    title: str
    author: str
    pages: int
    genres: List[str]

# 创建一个实例
book = Book(
    title="The Great Gatsby",
    author="F. Scott Fitzgerald",
    pages=180,
    genres=["Fiction", "Classic"]
)

print(book)

输出:

title='The Great Gatsby' author='F. Scott Fitzgerald' pages=180 genres=['Fiction', 'Classic']

 

这个例子清晰地展示了如何定义一个书籍的模型,包含了多个字段,如 titleauthorpagesgenres。通过继承 BaseModel,我们不仅明确了数据类型,还能轻松进行数据验证和转换。

4. 错误处理

当数据不符合模型的要求时,Pydantic 会抛出详细的错误信息,这对于调试和数据验证非常有用。

例子:【这个例子不对,后面会详细展开解释

from pydantic import BaseModel, ValidationError

class User(BaseModel):
    username: str
    email: str
    age: int  # 要改成age: conint(ge=0)这样才会报错如下, 其中conint是 constraint int的缩写

try:
    # email 字段缺失,age 字段传入了一个负数
    user = User(username="john_doe", email="john.doe@example.com", age=-5)
except ValidationError as e:
    print(e)

输出:【实际并不会输出如下结果,而是输出为空

1 validation error for User
age
  ensure this value is greater than or equal to 0 (type=value_error.number.not_ge; limit_value=0)

在这个例子中,age 被要求是大于或等于 0 的整数。当传入负值时,Pydantic 会返回一个详细的错误信息,指示数据不符合要求。

5. 模型实例化

你可以通过继承 BaseModel 定义的模型来方便地创建数据实例,并确保数据符合验证规则。

例子:

from pydantic import BaseModel

class Item(BaseModel):
    name: str
    description: str
    price: float

# 创建实例并进行验证
item = Item(name="Laptop", description="A powerful laptop", price=1200.5)
print(item)

输出:

name='Laptop' description='A powerful laptop' price=1200.5

通过 BaseModel 继承,我们可以方便地创建 Item 类的实例,确保字段类型符合定义。

6. 模型序列化与反序列化

Pydantic 提供了 .dict().json() 方法,允许你将模型对象转换成字典或 JSON 格式。这对于数据存储和传输非常有用。

例子:

from pydantic import BaseModel

class User(BaseModel):
    username: str
    email: str
    is_active: bool

# 创建实例
user = User(username="john_doe", email="john.doe@example.com", is_active=True)

# 转换为字典
user_dict = user.dict()
print(user_dict)

# 转换为 JSON
user_json = user.json()
print(user_json)

输出:

{'username': 'john_doe', 'email': 'john.doe@example.com', 'is_active': True}
{"username": "john_doe", "email": "john.doe@example.com", "is_active": true}

通过 .dict().json() 方法,你可以很容易地将模型实例转换为字典或 JSON 格式,用于存储或传输。

7. 反向转换(parse_obj)

你可以使用 BaseModel.parse_obj() 方法将字典或 JSON 数据转换为模型实例。这可以方便地将外部传入的数据转换成你定义的模型。

例子:

from pydantic import BaseModel

class Product(BaseModel):
    name: str
    price: float
    in_stock: bool

# 模拟外部传入的字典数据
data = {'name': 'Phone', 'price': 599.99, 'in_stock': True}

# 使用 parse_obj 将字典转换为模型实例
product = Product.parse_obj(data)
print(product)

输出:

name='Phone' price=599.99 in_stock=True

在这个例子中,我们用 parse_obj 方法将一个字典数据转换成了 Product 类的实例,Pydantic 会验证字典数据中的类型是否符合模型要求。

 

4、除了对整数的约束,列出所有其他的约束

from pydantic import conlist

# 创建一个受约束的列表,包含至少 1 个元素,但最多 5 个元素
tags: conlist(str, min_items=1, max_items=5)

 

5. conset(受约束的集合)

用于约束集合的大小(set 类型),类似于 conlist

例子:

from pydantic import conset

# 创建一个受约束的集合,包含至少 1 个元素,但最多 5 个元素
categories: conset(str, min_items=1, max_items=5)

6. conbytes(受约束的字节串)

用于约束字节串的大小和长度。

例子:

from pydantic import conbytes

# 创建一个受约束的字节串,长度介于 5 和 20 之间
data: conbytes(min_length=5, max_length=20)

7. condatetime(受约束的日期时间)

用于约束 datetime 对象的范围。

  • ge:大于或等于
  • le:小于或等于
  • gt:大于
  • lt:小于

例子:

from pydantic import condatetime
from datetime import datetime

# 创建一个受约束的日期时间,必须大于等于当前时间
timestamp: condatetime(ge=datetime.now())

8. EmailStr(邮箱字符串类型)

这是一个专门用于验证电子邮件地址的类型,确保字符串符合电子邮件的格式。

例子:

from pydantic import EmailStr

# 确保电子邮件地址格式正确
email: EmailStr

9. AnyUrl(任意 URL 类型)

用于验证任何有效的 URL。

例子:

from pydantic import AnyUrl

# 确保字段值是有效的 URL
website: AnyUrl

10. IPv4AddressIPv6Address

这些类型用于验证 IPv4IPv6 地址。

例子:

from pydantic import IPv4Address, IPv6Address

# 验证 IPv4 地址
ip_address_v4: IPv4Address

# 验证 IPv6 地址
ip_address_v6: IPv6Address

11. UUID

用于验证 UUID 字符串格式。

例子:

from pydantic import UUID

# 验证 UUID 格式
user_id: UUID

总结:

Pydantic 提供了多种约束类型来确保数据的合法性,并帮助我们更好地进行数据验证。

常见的约束类型包括 conintconstrcondecimalconlist 等,以及专门验证特定格式的数据类型,如 EmailStrAnyUrlIPv4Address 等。

通过这些约束,我们可以确保数据的准确性,并简化数据验证的工作。

 

posted @ 2025-02-07 09:46  AlphaGeek  阅读(546)  评论(0)    收藏  举报