Pydantic是一个数据验证和数据解析库,主要针对Python编程语言。它提供了一种简洁且高效的方法来定义和验证数据模型。其核心功能由BaseModel
类实现,而通过继承BaseModel
类,用户可以定义自己的数据模型,以便进行强类型验证和自动类型转换。以下是对pydantic.BaseModel
的详细讲解:
基础用法
首先,你需要安装Pydantic库:
pip install pydantic
然后,你可以导入BaseModel
并创建自己的数据模型类:
from pydantic import BaseModel
class User(BaseModel):
id: int
name: str
age: int = 18 # 默认值为18
# 实例化User类
user = User(id=1, name='Alice')
print(user)
# 输出: User(id=1, name='Alice', age=18)
# 验证数据类型
try:
invalid_user = User(id='NaN', name=10) # id应为int类型,name应为str类型
except Exception as e:
print(e)
# 输出: 1 validation error for User
# id
# value is not a valid integer (type=type_error.integer)
# name
# str type expected (type=type_error.str)
Field验证
使用Field
类来定义额外的验证和元数据:
from pydantic import BaseModel, Field
class Product(BaseModel):
id: int
name: str
price: float = Field(..., gt=0, description="The price must be greater than 0") # 必填项,且gt表示验证价格必须大于0
product = Product(id=101, name='Laptop', price=999.99)
print(product)
# 输出: Product(id=101, name='Laptop', price=999.99)
try:
invalid_product = Product(id=102, name='Smartphone', price=-150.0)
except Exception as e:
print(e)
# 输出: 1 validation error for Product
# price
# ensure this value is greater than 0 (type=value_error.number.not_gt; limit_value=0)
数据转换和别名
Pydantic会自动处理一些数据转换工作,比如将字符串转换为整数等。另外,你可以使用alias
字段来定义别名:
class Item(BaseModel):
product_id: int
product_name: str = Field(alias='name')
item = Item(product_id=200, name='Book')
print(item)
# 输出: Item(product_id=200, product_name='Book')
# 可以访问别名对应的数据
print(item.dict(by_alias=True))
# 输出: {'product_id': 200, 'name': 'Book'}
嵌套模型
数据模型可以相互嵌套,以表示复杂的数据结构:
class Address(BaseModel):
street: str
city: str
zip_code: str
class Customer(BaseModel):
id: int
name: str
address: Address
address = Address(street='123 Main St', city='New York', zip_code='10001')
customer = Customer(id=201, name='Bob', address=address)
print(customer)
# 输出: Customer(id=201, name='Bob', address=Address(street='123 Main St', city='New York', zip_code='10001'))
# 从JSON数据创建模型实例
import json
data = '''
{
"id": 202,
"name": "Charlie",
"address": {
"street": "456 Elm St",
"city": "Los Angeles",
"zip_code": "90001"
}
}
'''
customer_from_json = Customer.parse_raw(data)
print(customer_from_json)
# 输出: Customer(id=202, name='Charlie', address=Address(street='456 Elm St', city='Los Angeles', zip_code='90001'))
使用自定义验证器
Pydantic还允许你定义自定义验证器,以对字段进行更复杂的验证:
from pydantic import BaseModel, validator
class UserWithCustomValidation(BaseModel):
id: int
username: str
email: str
@validator('email')
def email_must_contain_at(cls, v):
if '@' not in v:
raise ValueError('Invalid email address')
return v
try:
user = UserWithCustomValidation(id=1, username='user1', email='invalid-email')
except Exception as e:
print(e)
# 输出: 1 validation error for UserWithCustomValidation
# email
# Invalid email address (type=value_error)
user = UserWithCustomValidation(id=2, username='user2', email='user2@example.com')
print(user)
# 输出: UserWithCustomValidation(id=2, username='user2', email='user2@example.com')
总结
Pydantic的BaseModel
提供了一种高效且直观的方式来进行数据验证、解析和转换。通过简单地定义数据模型,Pydantic能帮你自动处理大部分琐碎的验证逻辑,大幅提升代码的可读性和可靠性。