我是靠谱客的博主 醉熏柜子,最近开发中收集的这篇文章主要介绍python中@wraps的作用,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

下面两种用法等效

1.

@functools.wraps

2.

from functools import wraps

@wraps

根据[1]:functools.wraps 旨在消除装饰器对原函数造成的影响

#--------------------------------------

这东西,扯白了就是:

就是消除副作用。

#--------------------------------------

这里的副作用指的是:

原来是holiday函数,被@wrapper 作用后,名字变成了inner,为了消除这个副作用,我们使用@wraps

#--------------------------------------

是不是非用不可?

不是

#--------------------------------------

既然不是非用不可,那为什么要使用@wraps?

设想下,你的函数设计出了错,然后报错显示是inner函数,你会摸不着头脑,这到底是对应于哪个函数啊?

用了@wraps,你马上知道是holiday函数这个环节除了问题,对于调试有帮助

 

附录两段代码只有一句不同:

@wraps(func)的注释与否

 

wraps就是个语法糖,语法糖的意思就是,不管你吃不吃糖,你都要把这中药(语法)给我喝下!

中药不是挺苦么,喝下/前,给你一颗糖。

#-----------------附录---------------------

例子一:

使用@wraps

from functools import wraps


def wrapper(func):  # func = holiday
    @wraps(func)
    def inner(*args, **kwargs):
        print('在被装饰的函数执行之前做的事:比如公司检查你休假前是否完成工作了,否则要求你无常加薪')
        ret = func(*args, **kwargs)
        print('在被装饰的函数执行之后做的事:比如检查是否带薪休假')
        return ret
    return inner


@wrapper   # holiday = wrapper(holiday)
def holiday(day):
    ''' 这是一个放假通知 '''
    print('全体放假%s天'%day)
    return '好开心'


print("--------------1------------------------------")
print(holiday.__name__)
print("--------------2------------------------------")
print(holiday.__doc__)

print("--------------下面调用该函数看下效果-----------------------------")
holiday("111")

不使用@wraps

from functools import wraps


def wrapper(func):  # func = holiday
    # @wraps(func)
    def inner(*args, **kwargs):
        print('在被装饰的函数执行之前做的事:比如公司检查你休假前是否完成工作了,否则要求你无常加薪')
        ret = func(*args, **kwargs)
        print('在被装饰的函数执行之后做的事:比如检查是否带薪休假')
        return ret
    return inner


@wrapper   # holiday = wrapper(holiday)
def holiday(day):
    ''' 这是一个放假通知 '''
    print('全体放假%s天'%day)
    return '好开心'


print("--------------1------------------------------")
print(holiday.__name__)
print("--------------2------------------------------")
print(holiday.__doc__)

print("--------------下面调用该函数看下效果-----------------------------")
holiday("111")

 

例子二(这个例子的permission_required是装饰test_func的):

from functools import wraps
 
# 用户角色权限确认
def permission_required():
    def decorator(f):
        @wraps(f)
        def decorated_function():
            return('this is decorated function')
        return decorated_function
    return decorator
 
# 管理员权限确认
def admin_required(f):
    return permission_required()(f)
 
if __name__=='__main__':
    def test_func():
        return('this is test function')
    print(admin_required(test_func))

 

from functools import wraps
 
# 用户角色权限确认
def permission_required():
    def decorator(f):
        #@wraps(f)
        def decorated_function():
            return('this is decorated function')
        return decorated_function
    return decorator
 
# 管理员权限确认
def admin_required(f):
    return permission_required()(f)
 
if __name__=='__main__':
    def test_func():
        return('this is test function')
    print(admin_required(test_func))

[1]Python functools.wraps 深入理解

[2]What does functools.wraps do?

 

最后

以上就是醉熏柜子为你收集整理的python中@wraps的作用的全部内容,希望文章能够帮你解决python中@wraps的作用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(77)

评论列表共有 0 条评论

立即
投稿
返回
顶部