import time import functools def metric(parm): def decorator(fn): @functools.wraps(fn) def wrapper(*arg, **kwarg): b = time.time() res = fn(*arg, **kwarg) e = time.time() print('[%s]: %s executed in %s ms' % (parm, wrapper.__name__, e - b)) # 使用functools.wraps装饰器的作用,就在于获取函数名__name__的时候,可以使用wrapper函数。 return res return wrapper if isinstance(parm, str): """ @metric('INFO-FAST') def fast(x, y): pass 当使用这种方式时,传入的参数str类型,这个装饰器相当于执行 fast = metric('fast')(fast) """ return decorator elif callable(parm): # 使用callable判断参数parm是否为函数 """ @metric def slow(x, y, z): pass 当使用这种方式时,传入的参数function类型,这个装饰器相当于执行 slow = metric(slow) """ return decorator(parm) # 测试 @metric('INFO-FAST') 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('测试失败!')
现在已经实现既支持
@log('execute') def f(): pass
又支持
@log def f(): pass
各位再考虑一下,如何修改这个装饰器,让他还能支持
@log() def f(): pass
Sign in to make a reply
恢弘腾达
现在已经实现既支持
又支持
各位再考虑一下,如何修改这个装饰器,让他还能支持