原文: https://www.dazhuanlan.com/2019/12/26/5e0409c45a205/

对比测试
先看一个未使用functools.wraps的装饰器:

def time_consuming_deco(func):
    """
    计算运行func函数所消耗的时间
    """
    def wrapper(*args, **kwargs):
        start = time.time()*1000
        func(*args, **kwargs)
        end = time.time()*1000  # 转换成毫秒
        print('{0} time consuming: {1} ms'.format(func.__name__, end - start))
    return wrapper

下面使用上面的装饰器:

@time_consuming_deco
def f():
    for i in range(1000000):
        pass

f()
print("f.__name__ :", f.__name__)

运行结果为:

f time consuming: 22.99853515625 ms
f.__name__ : wrapper

再看一个使用了functools.wraps的装饰器:

def time_consuming_deco(func):
    """
    还是上面计算运行func函数所消耗的时间的装饰器,只不过是用使用了functools.wraps
    """
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        start = time.time()*1000
        func(*args, **kwargs)
        end = time.time()*1000  # 转换成毫秒
        print('{0} time consuming: {1} ms'.format(func.__name__, end - start))
    return wrapper

再次运行上面的测试程序结果如下:

f time consuming: 22.99853515625 ms
f.__name__ : f

小结
通过使用functools.wraps可以避免自定义装饰器对所装饰函数造成的函数名影响,防止在后面需要使用函数名的时候造成混乱.

相关文章:

  • 2021-07-17
  • 2021-07-23
  • 2022-02-06
  • 2021-12-20
  • 2022-12-23
  • 2021-10-19
  • 2022-12-23
猜你喜欢
  • 2021-05-19
  • 2021-07-28
  • 2022-12-23
  • 2022-12-23
  • 2021-09-01
  • 2022-12-23
相关资源
相似解决方案