pydantic之序章

246 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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',

}

"""