如何修复装饰器缺失参数问题?报错TypeError: update_wrapper()缺wrapper参数
解决TypeError: update_wrapper()缺失wrapper参数的问题
这个错误其实很好定位——你把@wraps的用法写错了!
错误核心原因
functools.wraps本身是一个需要接收参数的函数,它的作用是把原函数的元数据(比如函数名、文档字符串)复制到装饰后的包装函数上,所以必须传入被装饰的原函数f。
你现在写的是:
@wraps def decorated_function(*args, **kwargs): # ... 函数内容
这种写法相当于调用wraps()(不带任何参数),而wraps内部依赖的update_wrapper函数需要两个必传参数:wrapper(你的包装函数decorated_function)和wrapped(原函数f)。因为你没传f,直接导致update_wrapper缺失了必要的wrapper参数,从而抛出这个TypeError。
修正后的完整代码
from functools import wraps # 别忘了导入wraps! from flask import request, jsonify def authenticate_restful(f): @wraps(f) # 这里必须传入原函数f def decorated_function(*args, **kwargs): response_object = { 'status': 'fail', 'message': 'Provide a valid auth token.' } auth_header = request.headers.get('Authorization') if not auth_header: return jsonify(response_object), 403 auth_token = auth_header.split(' ')[1] resp = User.decode_auth_token(auth_token) if isinstance(resp, str): response_object['message'] = resp return jsonify(response_object), 401 user = User.query.filter_by(id=resp['sub']).first() if not user or not user.active: return jsonify(response_object), 401 return f(resp, *args, **kwargs) return decorated_function
后续调试小技巧
下次遇到装饰器相关的错误,可以试试这几个方法:
- 先确认装饰器的调用规则:带参数和不带参数的装饰器写法差异很大,比如
@wraps和@wraps(f)完全是两回事; - 查看完整的错误栈追踪,它会明确指出错误出在哪个函数的哪一行,帮你快速定位到装饰器的调用问题;
- 写极简测试用例对比:比如先写一个最简单的装饰器例子跑通,再和你的代码对比写法差异,很容易发现问题。
内容的提问来源于stack exchange,提问作者road_runner
相关产品推荐
相关产品推荐

