• pydantic学习与使用1.pydantic简介与基础入门 上海


    前言

    版本文档: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"
      }
    ]
    
  • 相关阅读:
    [Luogu P4178]Tree 题解(点分治+平衡树)
    [20190725NOIP模拟测试8]题解
    暑假集训考试反思+其它乱写
    [bzoj2752]高速公路 题解(线段树)
    bzoj1211树的计数 x bzoj1005明明的烦恼 题解(Prufer序列)
    [CQOI2014]数三角形 题解(找规律乱搞)
    [Catalan数三连]网格&有趣的数列&树屋阶梯
    [NOIP模拟测试7]visit 题解(组合数学+CRT+Lucas定理)
    [7.22NOIP模拟测试7]方程的解 题解(扩展欧几里得)
    leetcode371
  • 原文地址:https://www.cnblogs.com/yoyoketang/p/15906361.html
Copyright © 2020-2023  润新知