pydantic学习与使用-1.pydantic简介与基础入门

20 篇文章 8 订阅

前言

版本文档:v1.9.0
使用 python 类型注释的数据验证和设置管理。
pydantic在运行时强制执行类型提示,并在数据无效时提供用户友好的错误。
定义数据应该如何在纯粹的、规范的 python 中;并使用 pydantic 对其进行验证。

pydantic 简介

pydantic 主要是一个解析库,而不是验证库。
验证是达到目的的一种手段:建立一个符合所提供的类型和约束的模型。
换句话说,pydantic 保证输出模型的类型和约束,而不是输入数据。
这听起来像是一个深奥的区别,但事实并非如此。如果您不确定这意味着什么或它可能如何影响您的使用,您应该阅读下面有关数据转换的部分。
虽然验证不是 pydantic 的主要目的,但您可以使用此库进行自定义验证。

环境安装

python3.6+版本都可以直接pip安装使用

pip install pydantic

目前版本是v1.9.0

简单示例

当我们定义一个user对象的时候,它有id,name,birth,friends等属性.在pydantic中定义对象的主要方法是通过模型(模型继承自 BaseModel 的类)。

  • id 是一个字符串类型
  • name 也是字符串
  • birth 是生日,是一个日期类datetime
  • friends 是一个列表,列表里面是user的id

代码示例

from datetime import datetime
from typing import List, Optional
from pydantic import BaseModel


class User(BaseModel):
    id: int
    name = 'yo yo'
    birth: Optional[datetime] = None
    friends: List[int] = []


external_data = {
    'id': '123',
    'birth': '2019-06-01 12:22',
    'friends': [1, 2, '3'],
}
user = User(**external_data)
print(user.dict())  # dict() 函数将对象转化成字典

运行结果

{'id': 123, 'birth': datetime.datetime(2019, 6, 1, 12, 22), 'friends': [1, 2, 3], 'name': 'yo yo'}

运行过程中发生了什么?

在整个运行的过程中发生了什么?
先实例化 user = User(**external_data) 传入了external_data,以关键字参数传入,等价于

user = User(
    id='123',
    birth='2019-06-01 12:22',
    friends=[1, 2, '3']
)

id 是 int 类型;注释声明告诉pydantic该字段是必须的。如果可能,字符串、字节或浮点数将强制转换为int,否则将引发异常。
name 从默认值推断为其为 str 类型,该字段不是必须的,因为它有默认值。
birth 是 datetime 类型,该字段不是必须的,默认值为 None。pydantic会将表示unix时间戳(例如1496498400)的 int 类型或表示时间和日期的字符串处理成 datetime 类型。
friends 使用Python的 typing 系统,需要一个整数列表,就像 id 字段一样,类整数的对象将会被转换为整数。

前面实例化的时候,是按预期的参数传值的,如果id不是int 类型,实例化失败的时候,看看会发生什么?
如果验证失败,pydantic会抛出一个错误,列出错误的原因:

external_data1 = {
    'id': 'aaa',
    'birth': '2019-06-01 12:22',
    'friends': [1, 2, '3'],
}
user1 = User(
    **external_data1
)
user.dict()

校验失败,抛出异常ValidationError:id value is not a valid integer

Traceback (most recent call last):
  File ".../a.py", line 27, in <module>
    **external_data1
  File "pydantic\main.py", line 331, in pydantic.main.BaseModel.__init__
pydantic.error_wrappers.ValidationError: 1 validation error for User
id
  value is not a valid integer (type=type_error.integer)

接收异常

from pydantic import ValidationError
external_data1 = {
    'id': 'aaa',
    'birth': '2019-06-01 12:22',
    'friends': [1, 2, '3'],
}

try:
    user1 = User(**external_data1)
except ValidationError as e:
    print(e.json())

异常内容也可以用json格式展示

[
  {
    "loc": [
      "id"
    ],
    "msg": "value is not a valid integer",
    "type": "type_error.integer"
  }
]
  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts. spyder 5.4.1 requires pyqt5<5.16, which is not installed. spyder 5.4.1 requires pyqtwebengine<5.16, which is not installed. Successfully installed aiofiles-23.1.0 altair-4.2.2 blinker-1.6.2 cachetools-5.3.1 chardet-5.1.0 cmake-3.26.3 cpm_kernels-1.0.11 fastapi-0.95.2 ffmpy-0.3.0 gitdb-4.0.10 gitpython-3.1.31 gradio-3.32.0 gradio-client-0.2.5 h11-0.14.0 httpcore-0.17.2 httpx-0.24.1 latex2mathml-3.76.0 linkify-it-py-2.0.2 lit-16.0.5 markdown-it-py-2.2.0 mdit-py-plugins-0.3.3 mdtex2html-1.2.0 mdurl-0.1.2 nvidia-cublas-cu11-11.10.3.66 nvidia-cuda-cupti-cu11-11.7.101 nvidia-cuda-nvrtc-cu11-11.7.99 nvidia-cuda-runtime-cu11-11.7.99 nvidia-cudnn-cu11-8.5.0.96 nvidia-cufft-cu11-10.9.0.58 nvidia-curand-cu11-10.2.10.91 nvidia-cusolver-cu11-11.4.0.1 nvidia-cusparse-cu11-11.7.4.91 nvidia-nccl-cu11-2.14.3 nvidia-nvtx-cu11-11.7.91 orjson-3.8.14 protobuf-3.20.3 pydantic-1.10.8 pydeck-0.8.1b0 pydub-0.25.1 pygments-2.15.1 pympler-1.0.1 python-multipart-0.0.6 rich-13.4.1 semantic-version-2.10.0 sentencepiece-0.1.99 smmap-5.0.0 starlette-0.27.0 streamlit-1.22.0 streamlit-chat-0.0.2.2 torch-2.0.1 transformers-4.27.1 triton-2.0.0 tzlocal-5.0.1 uc-micro-py-1.0.2 uvicorn-0.22.0 validators-0.20.0 websockets-11.0.3 WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv 解释下
06-02

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值