decorator
鉴于decorator可以人为的改变函数的行为,而可以不去影响它的内部逻辑,因此我们可以通过装饰器来增强函数行为,让它在执行前后打印出我们想要观测的数据。
from time import sleep
def decorate_fun(fun):
def new_fun(*args, **kwargs):
print('got args: {}, {}'.format(args, kwargs))
print('this is a fun\'s start')
fun(*args, **kwargs)
print('this is the fun\'s end')
return new_fun
@decorate_fun
def fun(number, start_number=0):
for n in range(number):
start_number += n
print(n)
sleep(1)
print('the final number is {}'.format(start_number))
print(fun.__name__) # new_fun
fun(5, start_number=5)
如上,通过装饰器修饰之后,之前的函数fun会被new_fun替代,被重写的函数名和注释文档。为了避免这个情况,可以使用functools.wraps
:
from functools import wraps
def decorate_fun(fun):
@wraps(fun)
def new_fun(*args, **kwargs):
print('got args: {}, {}'.format(args, kwargs))
print('this is a fun\'s start')
fun(*args, **kwargs)
print('this is the fun\'s end')
return new_fun
# def fun..
print(fun.__name__) # fun