zoukankan      html  css  js  c++  java
  • Python

    前言

    为啥要学这个,因为 FastAPI 是基于它进行开发的,而且是个不错的框架,所以有必要深入学习

    前置学习

    Python 类型提示:https://www.cnblogs.com/poloyy/p/15145380.html

    typing 模块:https://www.cnblogs.com/poloyy/p/15150315.html

    Pydantic 介绍

    • 使用 python 类型注释来进行数据校验和 settings 管理
    • pydantic 可以在代码运行时强制执行类型提示,并在数据校验无效时提供友好的错误提示
    • 定义数据应该如何在规范的 python 代码中保存,然后通过 Python 验证它

    Pydantic 安装

    pip install pydantic

      

    测试 pydantic 是否已编译

    import pydantic
    
    print('compiled:', pydantic.compiled)
    
    
    # 输出结果
    compiled: True

    Pydantic 注意事项

    • pydantic 是一个解析库,而不是一个验证库
    • 验证是达到目的一种手段,构建符合所提供的类型和约束的模型
    • 简单来说:pydantic 保证输出模型的类型和约束,而不是输入数据

    Models

    简介

    • 在 pydantic 中定义对象的主要方法是通过模型(模型是从 BaseModel 继承的类)
    • 所有基于 pydantic 的数据类型本质上都是一个 BaseModel 
    • 可以将模型视为强类型语言中的类型(比如 Java)
    • 不受信任的数据可以传递给模型,经过解析和验证后,pydantic 保证生成的模型实例的字段将符合定义的字段类型(实例字段类型符合类定义的字段类型)

    基础模型使用

    from pydantic import BaseModel
    
    class User(BaseModel):
        id: int
        name = "小菠萝测试笔记"
    • User 就是一个模型(Models),有两个字段(属性)
    • id,整数 int 类型,是必传的
    • name,字符串 string 类型,不是必传,有默认值

    为什么能知道 name 是 string 类型?

    因为默认值是 string 类型,因此不需要类型提示( name : string )

    注意:当某些字段没有类型提示时,需要注意有关字段顺序的警告

    声明一个有效实例

    user = User(id='123')
    •  user 是 User 模型的一个实例对象,就叫模型实例对象吧
    • 对象的初始化会执行所有解析和验证,如果没有抛出 ValidationError,证明生成的模型实例是有效的

      

    访问模型实例对象的属性

    user = User(id='123')
    print(user.id, type(user.id))
    print(user.name, type(user.name))
    
    
    # 输出结果
    123 <class 'int'>
    小菠萝测试笔记 <class 'str'>
    • id 属性传的是字符串 '123',它会根据模型字段类型进行转换为 int
    • name 属性取了默认值

    __fields_set__

    该变量返回用户初始化对象时提供了什么字段

    # __fields_set__
    user = User(id='123')
    
    print(user.__fields_set__ == {'id'})
    print(user.__fields_set__ == {'name'})
    
    
    
    user = User(id='123', name="test")
    
    print(user.__fields_set__ == {'id', 'name'})
    print(user.__fields_set__ == {'id'})
    
    
    # 输出结果
    True
    False
    True
    False

    dict()

    可以提供字段的字典对象

    # dict()
    user = User(id='123')
    print(user.dict())
    print(dict(user))
    
    
    # 输出结果
    {'id': 123, 'name': '小菠萝测试笔记'}
    {'id': 123, 'name': '小菠萝测试笔记'}

      

    修改模型实例对象的属性

    # 修改模型实例属性值
    user = User(id='123')
    user.id = 321
    print(user.id)
    
    
    # 输出结果
    321

    BaseModels 属性

    其实就是 BaseModels 有什么自带的方法、属性

    dict()

    返回模型字段和值,字典格式

    user = User(id='123', name="test")
    print(user.dict(), type(user.dict()))
    
    
    # 输出结果
    {'id': 123, 'name': 'test'} <class 'dict'>

    json()

    返回模型字段和值,json 字符串格式

    user = User(id='123', name="test")
    print(user.json(), type(user.json()))
    
    # 输出结果
    {"id": 123, "name": "test"} <class 'str'>

    schema()

    以 JSON Schema 形式返回模型,字典格式

    user = User(id='123', name="test")
    
    print(user.schema(), type(user.schema()))
    
    
    # 输出结果
    {
        "title": "User",
        "type": "object",
        "properties": {
            "id": {
                "title": "Id",
                "type": "integer"
            },
            "name": {
                "title": "Name",
                "default": "小菠萝测试笔记",
                "type": "string"
            }
        },
        "required": [
            "id"
        ]
    }
    
    <class 'dict'>

    schema_json()

    以 JSON Schema 形式返回模型,json 字符串格式

    user = User(id='123', name="test")
    
    print(user.schema_json(), type(user.schema_json()))
    
    
    # 输出结果
    {
        "title": "User",
        "type": "object",
        "properties": {
            "id": {
                "title": "Id",
                "type": "integer"
            },
            "name": {
                "title": "Name",
                "default": "小菠萝测试笔记",
                "type": "string"
            }
        },
        "required": [
            "id"
        ]
    }
    
    <class 'str'>

      

    copy()

    浅拷贝模型对象

  • 相关阅读:
    Bootstrap 2.2.2 的新特性
    Apache POI 3.9 发布,性能显著提升
    SQL Relay 0.48 发布,数据库中继器
    ProjectForge 4.2.0 发布,项目管理系统
    红帽企业 Linux 发布 6.4 Beta 版本
    红薯 快速的 MySQL 本地和远程密码破解
    MariaDB 宣布成立基金会
    Percona XtraBackup 2.0.4 发布
    Rocks 6.1 发布,光盘机群解决方案
    精通Servlet研究,HttpServlet的实现追究
  • 原文地址:https://www.cnblogs.com/poloyy/p/15158713.html
Copyright © 2011-2022 走看看