小白一枚,最近在学习 FastAPI 框架的时候突然对代码很懵:
虽然说的很详细就是个可选参数,但是因为之前对 pydantic 库不了解,只知道 def(a: str) 这种基本用法了解,所以就完全搞不懂它的来源、原理。然后重新回头阅读文档发现原来人家已经把知识点给了,但是我在阅读的时候想当然的以为仅仅图上的就够了,试试证明自己还是年轻
进入正题,要想把 FastAPI 学习好,那 pydantic 就是第一个需要了解的库,废话不多说,下面开始介绍一下它:
首先基础的大家都是也都会用的就是:def(a: str) —>None: 这种了,基础的我就不怎么说,像其他的 int、list 等基础类型都是一样,注意一下像 list 这种也可以继续向列表内部申明元素类型,如下我偷人家 FastAPI 官网的截图:
在这里只简单说一下的两种用途,其他有需要的同学可以自行 Baidu 深入学习:
# 首先引入模块,需要安装的哟
from pydantic import BaseModel
# 继承BaseModel
class User(BaseModel):
username: str
password: str
describe: str = “非必需”
上面的例子,定义了一个 User 模型,继承自 BaseModel,有 3 个字段,username、password 是一个字符串并且是必需的,describe 是一个带有默认值的字符串并且不是必需的。这样的话在 FastAPI 中请求体的学习就完全理解并可以很快上手使用了
这个有篇文档上面说的很详细,俺就直接转摘了:https://cloud.tencent.com/developer/article/1949675
以下函数,参数 a 是必填项,b 给了默认值,是可选项。
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 会告诉你的 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)