functools.wraps

python标准模块functools提供的wraps函数可以让被装饰器装饰以后的函数保留原有的函数信息,包括函数的名称和函数的注释doc信息。

1. 自省信息丢失

函数被装饰以后,一些原本属于自己的自省信息会丢失,先来看装饰前的样子

def test(sleep_time):
    """
    测试装饰器
    :param sleep_time:
    :return:
    """
    time.sleep(sleep_time)


print(test.__name__)
print(test.__doc__)

执行输出结果

test

    测试装饰器
    :param sleep_time:
    :return:

test是函数的名字,__doc__是函数的注释说明

但在被普通的装饰器装饰以后,这些信息就会丢失

import time

def cost(func):
    def warpper(*args, **kwargs):
        t1 = time.time()
        res = func(*args, **kwargs)
        t2 = time.time()
        print(func.__name__ + "执行耗时" +  str(t2-t1))
        return res
    return warpper

@cost
def test(sleep_time):
    """
    测试装饰器
    :param sleep_time:
    :return:
    """
    time.sleep(sleep_time)


print(test.__name__)
print(test.__doc__)

程序输出结果

warpper
None

这是我们所不希望看到的

2. 修复自省信息

wraps可以防止被装饰的函数丢失自己的自省信息,只需要增加@wraps(func)即可

import time
from functools import wraps


def cost(func):
    @wraps(func)
    def warpper(*args, **kwargs):
        t1 = time.time()
        res = func(*args, **kwargs)
        t2 = time.time()
        print(func.__name__ + "执行耗时" +  str(t2-t1))
        return res
    return warpper

@cost
def test(sleep_time):
    """
    测试装饰器
    :param sleep_time:
    :return:
    """
    time.sleep(sleep_time)


print(test.__name__)
print(test.__doc__)

扫描关注, 与我技术互动

QQ交流群: 211426309

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案