我们通过以示例来看看带参数的装饰器到底怎么回事。
from time import perf_counter
from functools import wraps
def repeated(times):
def outer(fn):
@wraps(fn)
def inner(*args, **kwargs):
for i in range(0, times):
result = fn(*args, **kwargs)
return result
return inner
return outer
def timed(fn):
@wraps(fn)
def inner(*args, **kwargs):
start = perf_counter()
result = fn(*args, **kwargs)
elapsed = perf_counter() - start
print(f'{fn.__name__} took {elapsed:.6f}s to execute')
return result
return inner
def print_split_line():
print('*' * 50)
print_split_line()
@repeated(5)
@timed
def func1():
print('func1 running')
func1()
print_split_line()
@timed
@repeated(5)
def func2():
print('func2 running')
func2()
print_split_line()
def func3():
print('func3 running')
func3 = repeated(5)(timed(func3))
func3()
print_split_line()
def func4():
print('func4 running')
func4 = timed(repeated(5)(func4))
func4()
print_split_line()
输出如下:
************************************************** func1 running func1 took 0.000034s to execute func1 running func1 took 0.000020s to execute func1 running func1 took 0.000020s to execute func1 running func1 took 0.000020s to execute func1