温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

functools.wraps定义函数装饰器

发布时间:2020-08-11 19:53:06 来源:网络 阅读:825 作者:ck_god 栏目:编程语言
def tracer(func):
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        print('%s(%r,%r)->%r'%(func.__name__,args,kwargs,result))
        return result
    return wrapper

@tracer
def fibonacci(n):
    if n in (0,1):
        return n
    return (fibonacci(n-1)+fibonacci(n-2))

fibonacci(3)
print(fibonacci)
print('help:')
help(fibonacci)

从执行结果看到:最后的函数对象,变成了wrapper,而并非fibonacci函数对象。
因fibonacchi函数在装饰器后,wrapper对象赋值给了fibonacci函数对象,即fibnacchi = wrapper。

functools.wraps的使用:

也就是说,原函数的属性失效了
如果想要保留原函数的属性,就可以用到functools.wraps了

from functools import wraps
def tracer(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        print('%s(%r,%r)->%r'%(func.__name__,args,kwargs,result))
        return result
    return wrapper

@tracer
def fibonacci(n):
    if n in (0,1):
        return n
    return (fibonacci(n-1)+fibonacci(n-2))

fibonacci(3)
print(fibonacci)
print('help:')
help(fibonacci)

functools.wraps在执行之后,重新将函数赋值给原函数:wrapper = fibonacchi。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI