Python 中实现装饰器时使用 @functools.wraps 的理由

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python 中实现装饰器时使用 @functools.wraps 的理由相关的知识,希望对你有一定的参考价值。

Python 中使用装饰器对在运行期对函数进行一些外部功能的扩展。但是在使用过程中,由于装饰器的加入导致解释器认为函数本身发生了改变,在某些情况下——比如测试时——会导致一些问题。Python 通过 functool.wraps 为我们解决了这个问题:在编写装饰器时,在实现前加入 @functools.wraps(func) 可以保证装饰器不会对被装饰函数造成影响。比如,在 Flask 中,我们要自己重写 login_required 装饰器,但不想影响被装饰器装饰的方法,则 login_required 装饰器本身可以写成下面的样子:

def login_required_(func):
    @wraps(func)
    def decorated_view(*args, **kwargs):
        if current_app.login_manager._login_disabled:
            return func(*args, **kwargs)
        elif not current_user.is_authenticated:
            # return current_app.login_manager.unauthorized()
            return redirect(url_for("login.loginPage", next=request.url))
        return func(*args, **kwargs)

    return decorated_view

  

以上是关于Python 中实现装饰器时使用 @functools.wraps 的理由的主要内容,如果未能解决你的问题,请参考以下文章

Python中实现装饰模式的三种方式

Python MagicMock在使用装饰器时嘲弄太多

如何在 webflux 中实现自定义身份验证管理器时对未经授权的请求响应自定义 json 正文

解决报错:在Python中使用property装饰器时,出现错误:TypeError: descriptor ‘setter‘ requires a ‘property‘ object but(代码片

如何在 PHP 中实现装饰器?

Angular4 core.es5.js 使用类装饰器时需要未捕获的反射元数据填充程序