1.请设计一个decorator,它可作用于任何函数上,并打印该函数的执行时间:
# -*- coding: utf-8 -*-
import time, functools
import functools
def metric(fn):
@functools.wraps(fn)
def wrapper(*args, **kw):
t0 = time.time()
result = fn(*args, **kw)
print('%s executed in %.4f ms' % (fn.__name__, time.time() - t0))
return result
return wrapper
# 测试
@metric
def fast(x, y):
time.sleep(0.0012)
return x + y;
@metric
def slow(x, y, z):
time.sleep(0.1234)
return x * y * z;
f = fast(11, 22)
s = slow(11, 22, 33)
if f != 33:
print('测试失败!')
elif s != 7986:
print('测试失败!')
Run
#结果:
fast executed in 0.0020 ms
slow executed in 0.1240 ms
2.打印时间
import functools
def log(func):
@functools.wraps(func)
def wrapper(*args, **kw):
print('call %s():' % func.__name__)
return func(*args, **kw)
return wrapper
@log
def now():
print('2015-3-25')
now()
def logger(text):
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kw):
print('%s %s():' % (text, func.__name__))
return func(*args, **kw)
return wrapper
return decorator
@logger('DEBUG')
def today():
print('2015-3-25')
today()
print(today.__name__)
3.请编写一个decorator,能在函数调用的前后打印出’begin call’和’end call’的日志。
再思考一下能否写出一个@log的decorator,使它既支持:
@log
def f():
pass
又支持:
@log('execute')
def f():
pass
def log(arg):
def inner_log(text='call'):
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kw):
print('begin call')
print('%s %s():' % (text, func.__name__))
print('end call')
return func(*args, **kw)
return wrapper
return decorator
#########################################
@log
def f():
pass
@log('execute')
def f2():
pass
f() # call f():
f2() # execute f2():