在 Python 里,BaseModel 是 pydantic 库提供的一个基类,pydantic 是用于数据验证和设置管理的强大库。BaseModel 主要有以下作用:
1. 数据验证
BaseModel 能对输入的数据进行验证,保证数据符合定义的类型和约束。要是输入的数据不满足要求,pydantic 会抛出异常。
python
from pydantic import BaseModel, Field
class User(BaseModel):
name: str = Field(..., min_length=2, max_length=50)
age: int = Field(..., gt=0, lt=120)
# 验证通过
user1 = User(name="Alice", age=25)
print(user1)
# 验证失败,抛出异常
try:
user2 = User(name="A", age=150)
except Exception as e:
print(e)
输出结果:
cmd
name='Alice' age=25
2 validation errors for User
name
String should have at least 2 characters [type=string_too_short, input_value='A', input_type=str]
For further information visit https://errors.pydantic.dev/2.5/v/string_too_short
age
Input should be less than 120 [type=number_too_big, input_value=150, input_type=int]
For further information visit https://errors.pydantic.dev/2.5/v/number_too_big
2. 数据解析
BaseModel 可以把不同格式的数据(像字典、JSON 等)解析成 Python 对象,同时进行类型转换。
示例代码:
python
from pydantic import BaseModel
class Book(BaseModel):
title: str
price: float
# 从字典解析数据
book_data = {"title": "Python Crash Course", "price": 29.99}
book = Book(**book_data)
print(book)
输出结果:
cmd
title='Python Crash Course' price=29.99
3. 数据序列化
BaseModel 支持将 Python 对象序列化为字典或 JSON 字符串,方便数据的存储和传输。
py
from pydantic import BaseModel
class Product(BaseModel):
name: str
quantity: int
product = Product(name="Laptop", quantity=10)
# 序列化为字典
product_dict = product.model_dump()
print(product_dict)
# 序列化为 JSON 字符串
product_json = product.model_dump_json()
print(product_json)
输出结果:
cmd
{'name': 'Laptop', 'quantity': 10}
{"name": "Laptop", "quantity": 10}
4. 类型提示
借助 BaseModel 定义数据结构,能为代码提供清晰的类型提示,增强代码的可读性和可维护性。
在你当前编辑的代码里,Fetch 类继承自 BaseModel,目的是定义获取 URL 的参数,对输入参数进行验证和解析:
py
class Fetch(BaseModel):
"""Parameters for fetching a URL."""
url: Annotated[AnyUrl, Field(description="URL to fetch")]
max_length: Annotated[
int,
Field(
default=5000,
description="Maximum number of characters to return.",
gt=0,
lt=1000000,
),
]
start_index: Annotated[
int,
Field(
default=0,
description="On return output starting at this character index, useful if a previous fetch was truncated and more context is required.",
ge=0,
),
]
raw: Annotated[
bool,
Field(
default=False,
description="Get the actual HTML content of the requested page, without simplification.",
),
]