Python的Pydantic

BaseModel&BaseSetting

【参考文档】

==Pydantic==包是一个数据类型管理器,它主要用于规范接口的数据传递,在大型开发中有很大的用处,一般情况下我们经常使用两个子类

  • BaseModel:标准模型
  • BaseSetting:标准设置

他们两个在基础用法上没有太大差别,但是一个是普通的数据规范,一个是用于读取设置和环境变量参数,按照你的实际需求来定义数据就行,如果你的数据是作为环境变量使用的,就使用basesetting就可以了。

我们有一个涩图插件的配置需要从Json文件加载,内容包含管理员名单、使用涩图的CD、启用插件的群名单,先设计数据格式,如下

1
2
3
4
5
6
7
8
9
10
11
12
13
from pydantic import BaseSetting, Extra
from typing import List
class Config(BaseSetting):
superusers: List[str]
setu_cd: int
enable_groups: List[int]

class Config:
extra = Extra.ignore # 传入的多余参数处理方式(忽略)
case_sensitive = False # 环境变量大小写是否敏感
env_file = ".env" # 需要 python-dotenv依赖
env_prefix = "setu_" # 环境变量前缀(默认无前缀)

  • 实例化方法

    • 检查必须的传参:Config.__fields_set__

    • 直接传参

      setu_conf = Config(superusers=[],sety_cd=0,enable_group=[])

  • 访问/输出

    • Config.*:直接通过变量名访问值
    • 转换成字典输出
      • Config.dict()
      • dict(Config)
    • 转换成Json格式
      • Config.json()
    • 浅拷贝:Config.copy()
  • 辅助方法(函数)

    • Config.parse_obj( ...[dict_object]):从字典对象加载并实例化==推荐使用==
    • Config.parse_raw(...[str(dict)]):从一个字典形式的字符串加载并实例化
    • Config.parse_file([file_cursor | path]):从路径或文件指针对象加载Json文件并实例化

基本模型(BaseModel)也具有上述的方法,这里就不重复叙述

可以通过继承的方式修改一些属性的类型

1
2
3
4
5
6
7
8
from pydantic import BaseModel
from typing import List,Dict
class A(BaseModel):
test: List
TEST: str
class B(A):
test: Dict
# 通过这种方法,使用基本模型B时test就变成接受字典类型了

Field

Field类是一个有用的类,能更好的约束模型中的属性

1
2
3
4
5
6
from pydantic import Field,BaseModel
class test(BaseModel)
pid: int = Field(-1,description="图片的ID")
p: int = Field(-1,description="图片的P数",alias="pic")
url: str = Field("",description="图片网址")

具体的Field对象支持哪些写法见下表【参照】:

参数名称 描述
default (位置参数)字段的默认值。由于Field替换了字段的默认值,因此第一个参数可用于设置默认值。使用省略号 ( …) 表示该字段为必填项。
default_factory 当该字段需要默认值时将被调用。除其他目的外,这可用于设置动态默认值。禁止同时设置default和default_factory。
alias 字段的别名
description 文档字符串
exclude 在转储(.dict和.json)实例时排除此字段
include 在转储(.dict和.json)实例时(仅)包含此字段
const 此参数必须与字段的默认值相同(如果存在)
gt 对于数值 ( int, float, ),向 JSON SchemaDecimal添加“大于”的验证和注释exclusiveMinimum
ge 对于数值,这将添加“大于或等于”的验证和minimumJSON 模式的注释
lt 对于数值,这会为exclusiveMaximumJSON Schema添加“小于”的验证和注释
le 对于数值,这将添加“小于或等于”的验证和maximumJSON 模式的注释
multiple_of 对于数值,这会multipleOf向 JSON Schema添加“多个”的验证和注释
max_digits 对于Decimal值,这将添加验证以在小数点内具有最大位数。它不包括小数点前的零或尾随的小数零。
decimal_places 对于Decimal值,这增加了一个验证,最多允许小数位数。它不包括尾随十进制零。
min_itemsminItems 对于列表值,这会向 JSON Schema添加相应的验证和注释
max_itemsmaxItems 对于列表值,这会向 JSON Schema添加相应的验证和注释
unique_itemsuniqueItems 对于列表值,这会向 JSON Schema添加相应的验证和注释
min_lengthminLength 对于字符串值,这会向 JSON Schema添加相应的验证和注释
max_lengthmaxLength 对于字符串值,这会向 JSON Schema添加相应的验证和注释
allow_mutation 一个布尔值,默认为True. TypeError当为 False 时,如果在实例上分配了字段,则该字段引发 a 。模型配置必须设置validate_assignment为True执行此检查。
regex 对于字符串值,这会添加从传递的字符串生成的正则表达式验证和patternJSON 模式的注释
repr 一个布尔值,默认为True. 当为 False 时,该字段应从对象表示中隐藏。
** 任何其他关键字参数(例如examples)将逐字添加到字段的架构中

Python的Pydantic
https://qlozin.top/2023/01/16/Python Pydantic/
作者
QLozin
发布于
2023年1月17日
许可协议