FastAPI 中内省函数 inspect.signature() 作用
1. 基本作用:获取函数签名
inspect.signature()
返回一个 Signature
对象,包含函数的参数信息:
import inspectdef example_func(a: int, b: str = "default") -> bool:return True# 获取函数签名
sig = inspect.signature(example_func)
print(sig) # 输出: (a: int, b: str = 'default') -> bool
2. 为什么需要这个?
在装饰器中,我们需要保持原始函数的签名信息,否则:
没有签名保留的问题:
def decorator(func):def wrapper(*args, **kwargs):return func(*args, **kwargs)return wrapper@decorator
def example(a: int, b: str) -> bool:return True# 签名信息丢失!
print(inspect.signature(example)) # 输出: (*args, **kwargs) -> Any
有签名保留的效果:
def decorator(func):def wrapper(*args, **kwargs):return func(*args, **kwargs)wrapper.__signature__ = inspect.signature(func) # ✅ 保留签名return wrapper@decorator
def example(a: int, b: str) -> bool:return True# 签名信息保持完整!
print(inspect.signature(example)) # 输出: (a: int, b: str) -> bool
在 FastAPI 中的关键作用
FastAPI 依赖函数签名来
1、生成 OpenAPI 文档
@get("/items/{item_id}")
async def read_item(item_id: int, q: str = None) -> Item:return {"item_id": item_id, "q": q}
FastAPI 需要知道:
item_id
是路径参数,类型是int
q
是查询参数,类型是str
,可选返回类型是
Item
2、参数解析和验证
FastAPI 使用签名信息来:
解析请求参数
进行类型验证
生成相应的文档
4. Signature 对象的内容
def example(a: int, b: str = "default", *args, **kwargs) -> bool:return Truesig = inspect.signature(example)# 参数信息
for name, param in sig.parameters.items():print(f"{name}: {param}")# 输出:
# a: a: int
# b: b: str = 'default'
# args: *args
# kwargs: **kwargs# 返回类型
print(sig.return_annotation) # <class 'bool'
5. 实际应用场景
装饰器中的签名保留
def api_route_decorator(func):async def wrapper(*args, **kwargs):# 处理逻辑result = await func(*args, **kwargs)return {"code": 0, "data": result}# 关键:保留原始签名wrapper.__signature__ = inspect.signature(func)wrapper.__name__ = func.__name__wrapper.__doc__ = func.__doc__return wrapper
inspect.signature(func)
在这个代码中的作用是:
保持函数签名:确保 FastAPI 能正确解析参数
维护文档完整性:使生成的 OpenAPI 文档准确
支持类型检查:保持类型提示信息
确保功能正常:让依赖注入、参数验证等功能正常工作