Flask请求头校验装饰器requires_header如何添加正确的类型提示?
类型提示添加方案
你可以通过Python标准库的泛型标注工具来补全装饰器的类型提示,保证被装饰后的函数签名、返回值类型和原函数完全一致,符合类型检查规范。
第一步:新增导入
Python 3.10+ 版本直接从typing导入:
from typing import Callable, ParamSpec, TypeVar
如果使用Python 3.9及更低版本,先安装typing_extensions包,再从typing_extensions导入ParamSpec即可。
第二步:标注装饰器
# 定义泛型参数:P捕获原函数的参数类型,R捕获原函数的返回值类型 P = ParamSpec("P") R = TypeVar("R") def requires_header(func: Callable[P, R]) -> Callable[P, R]: @functools.wraps(func) def check_headers(*args: P.args, **kwargs: P.kwargs) -> R: if not flask.request.headers.get("X-Foo"): flask.abort(HTTPStatus.NOT_FOUND) return func(*args, **kwargs) return check_headers
说明
这种标注方式会完整保留原函数的类型信息,mypy、pyright等类型检查工具可以正确识别被@requires_header装饰的路由函数的参数和返回值类型,不会出现类型丢失、类型报错的问题,也完全兼容你代码里路由函数标注的ResponseReturnType返回类型。
内容的提问来源于stack exchange,提问作者stackunderflow
相关产品推荐
相关产品推荐

