基本使用

安装

  1. pip install pydantic


定义

pydantic 库的数据定义方式是通过 BaseModel 类来进行定义的,所有基于 pydantic 的数据类型本质上都是一个 BaseModel 类

  1. # coding=utf-8
  2. from pydantic import BaseModel
  3. class Person(BaseModel):
  4. name: str
  5. age: int

调用

调用时,只需对其进行实例化即可,实例化方法有以下几种:

  • 直接传值

    1. p = Person(name='kuma', age=24)
    2. print(p.name)
  • 字典传入

    1. person = {'name': 'kuma', 'age': 24}
    2. p = Person(**person) # 解包方式传给类
    3. print(p.name)

补充

  • 过滤
    1. person = {'name': 'kuma', 'age': 24, 'gender': 'girl'}
    2. p = Person(**person)
    3. print(p.json()) # 结果显示额外的 gender 被自动过滤了

    传入值多于定义值时,BaseModel 会自动过滤,这样传递数据更安全,同时也意味着在前期的定义中必须尽可能定义完全

  • 转换 ```python p = Person(name=123, age=’12’) print(p.json())

{‘name’:’123’, ‘age’:12} ``` pydantic 在传输数据时会直接对数据类型转换,如果数据传输格式错误,可以通过转换变为正确的数据类型,如果不能转换则报错

模型属性

通过较为复杂的数据类型实现一些高级数据结构

可选数据类型

如果有一个数据类型不是必须的,可以允许用户在使用中不进行传入,则可以使用 typing 库中的 Optional 方法实现

  1. # coding=utf-8
  2. from pydantic import BaseModel
  3. from typing import Optional
  4. class Person(BaseModel):
  5. id: Optional[int] # 使用 Optional[] 设定可选数据
  6. name: str
  7. p = Person(name='kuma')
  8. print(p.json())

设置为可选数据类型时,该数据仍然会有该字段,但是其默认值为 None。即当不传入 id 字段是,Person 仍然可以取到 age,只是值为 None

数据默认值

  1. # coding=utf-8
  2. from pydantic import BaseModel
  3. from typing import Optional
  4. class Person(BaseModel):
  5. name: str
  6. age: int = 24
  7. p = Person(name='kuma')
  8. print(p.json())

多种数据类型

  1. # coding=utf-8
  2. from typing import Union
  3. from pydantic import BaseModel
  4. class Person(BaseModel):
  5. time: Union[int, str] # 或者用 List[int or str],即前面 typing 要导入 List
  6. p = Person(time=1234)
  7. print(p.json)
  8. p1 = Person(time='2021-08-17')
  9. print(p1.json)

异名数据传递

一个模型中的一个变量名为 A,在后续的定义中,将这个变量命名为 B,同时能进行两个不同名称参量的相互传递,可以用 Filed 方法解决

  1. # coding=utf-8
  2. from pydantic import BaseModel, Field
  3. class Test(BaseModel):
  4. pwd: str = Field(alias='key')
  5. t = Test(key='12345') # 需用 key 关键词来传入 pwd 变量
  6. print(t.json())