pydantic库是什么

背景

FastAPI 站在巨人的肩膀上,其中之一就是Pydantic.

image

pydantic在运行时强制执行类型提示,并在数据无效时提供用户友好的错误。

看看什么是pydantic

官网:https://pydantic-docs.helpmanual.io/
其他博客:https://blog.csdn.net/codename_cys/article/details/107675748

总结一句话:pydantic保证输出模型的类型和约束。你搭建了一套web服务,提供了很多接口,每个接口需要接受什么样类型的参数那都是有定数的,不能让别人随便给你传参啊,这就可以使用pydantic来校验或者强制转换成我们希望的数据类型。

如何使用

from pydantic import BaseModel


class Person(BaseModel):
    name: str


# 1.直接传值
p1 = Person(name='tarzan111')
print(p1.json())
# 1.1 如果传的是是int型,会自动转型。如果无法自动转换那就报错了
_p1 = Person(name=123)
print(_p1.json())
# 2.通过字典传值
data2 = {
    'name': 'tarzan222',
    'age': '28'  # age会被自动过滤
}
p2 = Person(**data2)
print(p2.json())

输出:

{"name": "tarzan111"}
{"name": "123"}
{"name": "tarzan222"}

更多类型说明

from pydantic import BaseModel
from typing import Dict, List, Sequence, Set, Tuple


class Demo(BaseModel):
    a: int  # 整型
    b: float  # 浮点型
    c: str  # 字符串
    d: bool  # 布尔型
    e: List[int]  # 整型列表
    f: Dict[str, int]  # 字典型,key为str,value为int
    g: Set[int]  # 集合
    h: Tuple[str, int, int]  # 元组


data1 = {
    'a': 1,
    'b': 1.1,
    'c': 'tarzan',
    'd': True,
    'e': [1, 2, 3],
    'f': {'name': 123, 'age': 29},
    'g': {1, 5, 7, 8, 9, 4, 2, 2, 2},
    'h': (True, 2, 3)

}
demo1 = Demo(**data1)
print(demo1.json())
print(demo1.d)

输出:

{"a": 1, "b": 1.1, "c": "tarzan", "d": true, "e": [1, 2, 3], "f": {"name": 123, "age": 29}, "g": [1, 2, 4, 5, 7, 8, 9], "h": ["True", 2, 3]}
True

typing模块的作用: https://docs.python.org/zh-cn/3/library/typing.html
可以使用别名:

from typing import Dict, List, Sequence, Set, Tuple
Vector = List[float]


def scale(scalar: float, vector: Vector) -> Vector:
    return [scalar * num for num in vector]

print(scale(2.0, [2.0, 3.0]))

输出:

[4.0, 6.0]

image

更多过滤方法

from pydantic import BaseModel, Field
from typing import Optional, Union


class Tarzan(BaseModel):
    a: int = Field(..., gt=0, lt=5)  # ...是必传参
    b: int = Field(0)  # 有默认值 0
    c: int = 1  # 也是默认 0
    d: Optional[int]  # 可选参数 不传则为 null
    time: Union[int, str]  # int 或 str
    password: str = Field(..., alias="key")  # 传参是使用别名 key 来代替password


t1 = Tarzan(a=2, time=2023, key='123456')
print(t1.json())

输出

{"a": 2, "b": 0, "c": 1, "d": null, "time": 2023, "password": "123456"}

配置环境

可以阅读:https://www.duyixian.cn/2022/05/20/manage-app-configuration-with-pydantic/
新建config.py

from pydantic import BaseSettings


class Settings(BaseSettings):
    env: str = 'dev'
    app_key: str = 'app_key'
    app_secret: str = 'secret'


def get_setting():
    setting = Settings()
    return setting


if __name__ == '__main__':
    s = get_setting()
    print(s.json())

输出:
{"env": "dev", "app_key": "app_key", "app_secret": "secret"}
这里需要注意BaseSettings 会获取系统中的环境变量:

  1. 打开终端输入:export env=test
  2. 然后执行python3 -m config.py,这时就会输出
    {"env": "test", "app_key": "app_key", "app_secret": "secret"}
posted @ 2023-01-12 10:16  Tarzen  阅读(271)  评论(0编辑  收藏  举报