You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复装饰器缺失参数问题?报错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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 22:58:10