Python 学习 FastAPI:必备了解学习的库:pydantic

su_ · 2023年04月06日 · 3902 次阅读

小白一枚,最近在学习 FastAPI 框架的时候突然对代码很懵:
虽然说的很详细就是个可选参数,但是因为之前对 pydantic 库不了解,只知道 def(a: str) 这种基本用法了解,所以就完全搞不懂它的来源、原理。然后重新回头阅读文档发现原来人家已经把知识点给了,但是我在阅读的时候想当然的以为仅仅图上的就够了,试试证明自己还是年轻

进入正题,要想把 FastAPI 学习好,那 pydantic 就是第一个需要了解的库,废话不多说,下面开始介绍一下它:
首先基础的大家都是也都会用的就是:def(a: str) —>None: 这种了,基础的我就不怎么说,像其他的 int、list 等基础类型都是一样,注意一下像 list 这种也可以继续向列表内部申明元素类型,如下我偷人家 FastAPI 官网的截图:

在这里只简单说一下的两种用途,其他有需要的同学可以自行 Baidu 深入学习:

  • 1.模型
  • 2.Typing 类型中的 Optional 和 Union

1.模型

# 首先引入模块,需要安装的哟
from pydantic import BaseModel

# 继承BaseModel
class User(BaseModel)
  username: str
  password: str
  describe: str = 非必需

上面的例子,定义了一个 User 模型,继承自 BaseModel,有 3 个字段,username、password 是一个字符串并且是必需的,describe 是一个带有默认值的字符串并且不是必需的。这样的话在 FastAPI 中请求体的学习就完全理解并可以很快上手使用了

2.Typing 类型中的 Optional 和 Union

这个有篇文档上面说的很详细,俺就直接转摘了:https://cloud.tencent.com/developer/article/1949675
以下函数,参数 a 是必填项,b 给了默认值,是可选项。

  • a 参数声明为 int 类型
  • b 参数声明为 int 类型,并给了默认值 1
  • -> int 是声明函数返回值是 int 类型
def fuc1(a: int, b: int = 1) -> int:
  print(a+b的值为:, a+b)
  return a+b
if name == main:
    fuc1(2)

如果我们想给 b 参数设置默认值为 None, 如果用户传了 b 参数,b 必须是 int 类型,于是可以设置b: int = None

def fuc1(a: int, b: int = None) -> int:
    if b:
        print(a+b的值为:, a+b)
        return a + b
    else:
        print(a的值为:, a)
        return a
if name == main:
    fuc1(2)

以上代码在 pycharm 编辑器上执行是没有问题的,但是有些编辑器并不能识别b: int = None 这种语法。于是就有了 Optional 类。

  • Optional 可选类型

Optional 的作用是可选类型,作用几乎和带默认值的参数等价。不同的是使用 Optional 会告诉你的 IDE 或者框架:这个参数除了给定的默认值外还可以是 None,而且使用有些静态检查工具如 mypy 时,对 a: int =None 这样类似的声明可能会提示报错,但使用 a :Optional[int] = None 不会。
typing.Optional 可选类型

Optional[X] 等价于 Union[X, None]

请注意,这与可选参数的概念不同,后者是默认参数,具有默认值的可选参数 Optional 仅在其类型注释中不需要限定符,因为它是可选的。
例如:

def foo(arg: int = 0) -> None:
   

另一方面,如果 None 允许使用显示值,则 Optional 无论参数是否可选,的适合使用,例如:def foo(arg: Optional[int] = None) -> None:
Optional[X] 等价于 Union[X, None],当 Optional 参数的默认值为 None 时

from typing import Optional
def func(a: int, b: Optional[int] = None) -> None:
    “””Optional[int]=None”””
    if b:
        print(a+b的值:”, a+b)
    else:
        print(b is None)
if name == main:
    func(2)

运行结果:b is None
当 Optional 参数的默认值不为 None,为 1 的时候

from typing import Optional
def func(a: int, b: Optional[int] = 1) -> None:
    “””Optional[int]=None”””
    if b:
        print(a+b的值:”, a+b)
    else:
        print(b is None)
if name == main:
    func(a=1, b=None)
![](https://img2022.cnblogs.com/blog/1070438/202202/1070438-20220218214951830-1083066501.png)

此时传 b=None,编辑器也不会提示有问题,这说明函数中 b 是一个可选参数,并且提示你它的默认值可以为 None。
如果一个参数可以是 2 种类型,上面的函数 b 参数,可以是 None, 也可以是 int, 于是可以这样写

from typing import Optional, Union
def func(a: int, b: Union[None, int] = 1) -> None:
    “””Optional[int]=None”””
    if b:
        print(a+b的值:”, a+b)
    else:
        print(b is None)
if name == main:
    func(a=1, b=None)
  • 注:第二点就是转载过来的。仅供学习记录
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册