functools.wraps定义函数装饰器

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。

成都创新互联成立与2013年,先为师宗等服务建站,师宗等地企业,进行企业商务咨询服务。为师宗企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。

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定义函数装饰器
网站网址:http://bzwzjz.com/article/gohpie.html

其他资讯

Copyright © 2007-2020 广东宝晨空调科技有限公司 All Rights Reserved 粤ICP备2022107769号
友情链接: 定制网站设计 成都网站建设公司 成都网站建设 企业网站制作 成都网站建设公司 高端网站设计 宜宾网站设计 成都网站制作 攀枝花网站设计 四川成都网站制作 成都网站设计公司 重庆网站建设 成都定制网站建设 网站制作 成都品牌网站设计 app网站建设 网站建设费用 重庆网站建设 成都网站设计 温江网站设计 成都网站建设 外贸网站设计方案