Discuss / Python / 详解、晋级

详解、晋级

Topic source

恢弘腾达

#1 Created at ... [Delete] [Delete and Lock User]
import timeimport functoolsdef 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@metricdef slow(x, y, z):    time.sleep(0.1234)    return x * y * zf = fast(11, 22)s = slow(11, 22, 33)if f != 33:    print('测试失败!')elif s != 7986:    print('测试失败!')

现在已经实现既支持

@log('execute')def f():    pass

又支持

@logdef f():    pass

各位再考虑一下,如何修改这个装饰器,让他还能支持

@log()def f():    pass

  • 1

Reply