FastAPI中如何将查询参数的Schema定义为独立变量?
问题解答
原写法可行性判断
你提供的写法不可行,原因有两点:
- Python字典的语法不支持直接在键值对中写类型注解和参数默认值,你示例的
param_definition字典本身就存在语法错误 - Python的函数参数签名是静态定义的,无法直接用自定义的字典/结构体作为模板自动展开生成参数列表
可落地的易维护实现方案
下面给出两种常用的生产级实现方案,都可以实现参数定义统一抽离、一处修改全量生效的需求:
方案1:使用标准库dataclass(无第三方依赖)
适合不需要额外参数校验的普通Python场景:
from dataclasses import dataclass from typing import Optional @dataclass class GetParams: key: Optional[str] = "key" value: Optional[str] = "value" param1: Optional[int] = -1 # 函数定义方式1:直接传参数实例 def get(params: GetParams): # 内部使用时直接取属性即可 print(params.key, params.value, params.param1) ... # 调用示例 get(GetParams(key="custom_key", param1=10)) # 函数定义方式2:兼容原调用方式(支持直接传关键字参数) def get(**kwargs): params = GetParams(**kwargs) ... # 兼容原调用方式的调用示例 get(key="custom_key", param1=10)
方案2:使用Pydantic模型(适合接口开发场景)
如果是Web接口开发,更推荐用Pydantic模型,自带参数校验、序列化/反序列化能力,FastAPI、Flask等主流框架都原生支持:
from pydantic import BaseModel from typing import Optional class GetParams(BaseModel): key: Optional[str] = "key" value: Optional[str] = "value" param1: Optional[int] = -1 # 以FastAPI为例,直接将模型声明为依赖即可自动解析查询参数 from fastapi import FastAPI, Depends app = FastAPI() @app.get("/api/xxx") def get(params: GetParams = Depends()): ...
两种方案都可以实现参数定义的统一维护,后续要新增/修改/删除参数只要改GetParams类即可,不需要逐个修改所有函数的参数签名。
内容的提问来源于stack exchange,提问作者Prasanna
相关产品推荐
相关产品推荐

