@wraps()装饰器的作用

本文探讨了Python装饰器的作用,特别是`functools.wraps`装饰器的功能。通过示例代码展示,当不使用`wraps`时,被装饰函数的元信息(如`__doc__`和`__name__`)会被改变,导致混淆。而`functools.wraps`可以保持原函数的元信息不变,确保函数行为的一致性和调试的准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

很多python代码中有一个默认装饰器,大概的样子为如下:

@wraps(func)

@functools.wraps(func)

然而去掉这个装饰器程序运行也不受影响,所以非常疑惑这个装饰器的作用,所以写了如下的测试代码:

# coding = utf-8

from functools import wraps

def decoretor(func):
    def wrapper(*args, **kwargs):
        '''my decoretor'''
        return func(*args, **kwargs)
    return wrapper

@decoretor
def myfunc():
    '''my function'''
    print('my function')

if __name__ == '__main__':
    print((myfunc.__doc__, myfunc.__name__))

这个代码的执行输出为:

('my decoretor', 'wrapper')

这说明myfunc()函数被装饰@decoretor装饰后,myfun()失去了本身的属性,编程了装饰器函数内部的属性,这样就改变了myfunc函数的本身的属性。再查看代码和调试的时候会产生歧义,所以我们需要消除这种歧义,所以使用@wrapper装饰器来做这个工作,看下面代码的输出:

# coding = utf-8

from functools import wraps

def decoretor(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        '''my decoretor'''
        return func(*args, **kwargs)
    return wrapper

@decoretor
def myfunc():
    '''my function'''
    print('my function')

if __name__ == '__main__':
    print((myfunc.__doc__, myfunc.__name__))

这个代码的执行结果为

('my function', 'myfunc')

所以加入代码@wraps(func)后,用decoretor再装饰myfunc代码后,还是原来myfunc的属性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值