开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情
书接上文,上面文章我们了解python是一个动态类型强类型的语言,这是一个较为好的方式,同时也较为麻烦,那么难道只能依赖PEP 484 了嘛?当时不是,今天我们来讲讲pydantic这个起源自2017年,基于python类型非常好用提示来定义数据验证,序列化,文档的库。
pydantic可以帮助我们很容易解决上篇文章中所提到的问题,使用pydantic可以在代码运行的时候提供数据校验和类型提示,当校验失败的时候也可以提供友好的错误提示。
同时pydantic对各个框架的兼容性特别强,同时拥有非常丰富的插件,Mypy插件啦,Pycharm插件啦等等。
今天我们就来入入门
pydantic 的大部分校验都是基于BaseModel来使用的 BaseModel 来自于pydantic.BaseModel 先看一个简答的例子
from pydantic import BaseModel
class Book(BaseModel):
name: str
size = 5
: 代表 数据类型(datatype)
= 后的值代表默认值
上面我们看过了定义的例子,下面我们来看一个简单的使用例子
book = Book(name="西游记")
assert book.name == "西游记"
利用 key-argurment 来实例化 pydantic.BaseModel 对象,像是使用 attribute 的方式来取值一样方便。
另外这里介绍两个实用的方法,也为后面文章做一个简单的前情提要在这里
book.json() : 将对象转换为 json 字串
book.dict() : 将对象转换为 dict 格式
最后我们来看一下报错信息,方便定位
>>> book = Book(name=5, size="big")
pydantic.error_wrappers.ValidationError: 1 validation error for Book
完整例子如下,基于python3.7来的
from datetime import datetime
from typing import List, Optional
from pydantic import BaseModel
class User(BaseModel):
age: int
name = 'Tom Doe'
create_time: Optional[datetime] = None
books: List[int] = []
check_data = {
'age': '23',
'create_time': '2022-11-22 10:24',
'books': [1, 2, '3'],
}
user = User(**check_data)
print(user.age)
#> 23
print(repr(user.create_time))
#> datetime.datetime(2022, 11, 22, 10, 24)
print(user.friends)
#> [1, 2, 3]
print(user.dict())
结果如下:
"""
{
'age': 123,
'create_time': datetime.datetime(2022, 11, 22, 10, 24),
'friends': [1, 2, 3],
'name': 'Tom Doe',
}
"""