该库的官方文档位置为:https://pydantic-docs.helpmanual.io/
不知道大家是否非常羡慕C语言等在进行函数传参时,可以指定数据类型来传参呢?
我之前有一篇讲过使用typing
来指定数据类型,但是其仅仅是能指定数据类型,只能做一个提醒的作用,那么我们如何来结合typing
模块,来写一个可以像Java等语言的指定参数类型呢?这里我推荐pydantic
库。
首先,在学这个库之前,我们需要去回顾一下typing
库的使用方法:https://blog.csdn.net/qq_62789540/article/details/124790174
然后,我们来解释一下我们即将要学的库:
其使用 Python 类型注释的数据验证和设置管理。
pydantic在运行时强制执行类型提示,并在数据无效时提供用户友好的错误。
定义数据应该如何在纯的、规范的 Python 中保存;用pydantic验证它。
所以pydantic使用了一些很酷的新语言特性,但我为什么要实际去使用它呢?
与您的 IDE/linter/brain 配合得很好
无需学习新的模式定义微语言。如果你知道如何使用 Python 类型提示,你就会知道如何使用pydantic。数据结构只是您使用类型注释定义的类的实例,因此自动完成、linting、mypy、IDE(尤其是PyCharm)和您的直觉都应该与您的验证数据正常工作。
两用
pydantic 的 BaseSettings类允许在“验证此请求数据”上下文和“加载我的系统设置”上下文中使用*pydantic 。*主要区别在于系统设置可以从环境变量中读取,并且通常需要更复杂的对象,例如 DSN 和 Python 对象。
快速地
pydantic一直非常重视性能,大多数库都是用 cython 编译的,加速了约 50%,它通常与大多数类似库一样快或更快。
验证复杂结构
使用递归pydantic模型、typing
的 标准类型(例如List
、Tuple
等Dict
)和 验证器允许清晰、轻松地定义、验证和解析复杂的数据模式。
可扩展
数据类集成
以及BaseModel
,pydantic提供了一个dataclass
装饰器,它创建(几乎)带有输入数据解析和验证的普通 Python 数据类。
安装这个库的方法非常简单:
pip install pydantic
安装配置的扩展功能:
pip install pydantic[email] # 邮箱验证支持
# or
pip install pydantic[dotenv] # dotenv文件支持
# or just
pip install pydantic[email, dotenv] # 同时安装
如果想要通过其他方式安装,可以参考官方文档
在pydantic中定义对象的主要方法是通过模型(模型只是继承自 的类BaseModel
)。
您可以将模型视为类似于严格类型语言中的类型,或者视为 API 中单个端点的要求。
不受信任的数据可以传递给模型,并且在解析和验证之后,pydantic保证生成的模型实例的字段将符合模型上定义的字段类型。
属性 | 描述 |
---|---|
dict() |
返回模型字段和值的字典 |
json() |
返回一个JSON字符串表示dict() |
copy() |
返回模型的副本,浅拷贝 |
parse_obj() |
如果对象不是字典,则用于将任何对象加载到具有错误处理的模型中的实用程序 |
parse_raw() |
用于加载多种格式字符串的实用程序 |
from_orm() |
将数据从任意类加载到模型中 |
schema() |
返回将模型表示为JSON Schema的字典 |
schema_json() |
返回schema() 的JSON字符串表示形式 |
construct() |
无需运行验证即可创建模型的类方法 |
__fields_set__ |
初始化模型实例时设置字段名称集 |
__fields__ |
模型字段的字典 |
__config__ |
模型的配置类 |
from pydantic import BaseModel
class Foo(BaseModel):
count: int
size: float | None = None
class Bar(BaseModel):
apple = 'x'
banana = 'y'
class Spam(BaseModel):
foo: Foo
bars: list[Bar]
m = Spam(foo={
'count': 4}, bars=[{
'apple': 'x1'}, {
'apple': 'x2'}])
print(m)
#> foo=Foo(count=4, size=None) bars=[Bar(apple='x1', banana='y'),
#> Bar(apple='x2', banana='y')]
print(m.dict())
"""
{
'foo': {'count': 4, 'size': None},
'bars': [
{'apple': 'x1', 'banana': 'y'},
{'apple': 'x2', 'banana': 'y'},
],
}
"""