对比测试
先看一个未使用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可以避免自定义装饰器对所装饰函数造成的函数名影响,防止在后面需要使用函数名的时候造成混乱.