码迷,mamicode.com
首页 > 其他好文 > 详细

functools.wraps定义函数装饰器

时间:2018-09-10 12:01:47      阅读:139      评论:0      收藏:0      [点我收藏+]

标签:war   pre   port   定义   int   __name__   code   使用   fibonacci   

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。

functools.wraps定义函数装饰器

标签:war   pre   port   定义   int   __name__   code   使用   fibonacci   

原文地址:http://blog.51cto.com/13914991/2173042

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!