持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情
创建Enum类
- 当我们设计的URL中的路径参数,包含部分枚举变量时,我们可以使用Python的
Enum类型 - 比如:路径参数
/model/{model_name}中的model_name是枚举变量,枚举值是三个字符串,此时可以创建一个Enum类ModelName
from enum import Enum
class ModelName(str, Enum):
alexnet = "alexnet"
resnet = "resnet"
lenet = "lenet"
- 导入
Enum并创建一个继承自str和Enum的子类。
- 通过从
str继承,API 文档将能够知道这些值必须为string类型并且能够正确地展示出来。
- 然后创建具有固定值的类属性,这些固定值将是可用的有效值。
声明路径参数
- 使用你定义的枚举类(
ModelName)创建一个带有类型标注的路径参数:
from enum import Enum
from fastapi import FastAPI
class ModelName(str, Enum):
alexnet = "alexnet"
resnet = "resnet"
lenet = "lenet"
app = FastAPI()
@app.get("/models/{model_name}")
async def get_model(model_name: ModelName):
pass
- 此时,因为
model_name的类型是ModelName所以,这个变量的值只可能是该枚举变量的一个枚举成员。
- 应为指定了路径参数可用值,所以API交互式文档上也会展示下拉可选的三个枚举值。
比较枚举成员
- 变量
model_name可以和你创建的枚举类ModelName中的枚举成员进行比较:
from enum import Enum
from fastapi import FastAPI
class ModelName(str, Enum):
alexnet = "alexnet"
resnet = "resnet"
lenet = "lenet"
app = FastAPI()
@app.get("/models/{model_name}")
async def get_model(model_name: ModelName):
if model_name == ModelName.alexnet:
return {"model_name": model_name, "message": "Deep Learning FTW!"}
获取枚举值
- 可以使用
model_name.value来获取实际的值(在这个例子中为str): - 你也可以通过
ModelName.lenet.value来获取值"lenet"。
from enum import Enum
from fastapi import FastAPI
class ModelName(str, Enum):
alexnet = "alexnet"
resnet = "resnet"
lenet = "lenet"
app = FastAPI()
@app.get("/models/{model_name}")
async def get_model(model_name: ModelName):
if model_name.value == "lenet":
return {"model_name": model_name, "message": "LeCNN all the images"}
返回枚举成员
- 在路径操作函数内,可以直接将枚举类型的变量响应给客户端,该变量会在返回给客户端之前转换为对应的值
- 比如,下面例子中的
model_name会转换为三个字符串(因为ModelName继承str所以本质上还是字符串)。 - 即使枚举变量
model_name嵌套在列表或字典中,在返回个客户端之前都会被转换为具体类型的值。
from enum import Enum
from fastapi import FastAPI
class ModelName(str, Enum):
alexnet = "alexnet"
resnet = "resnet"
lenet = "lenet"
app = FastAPI()
@app.get("/models/{model_name}")
async def get_model(model_name: ModelName):
return {"model_name": model_name, "message": "Have some residuals"}