Discuss / Python / 晋级详解

晋级详解

Topic source

恢弘腾达

#1 Created at ... [Delete] [Delete and Lock User]
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


  • 1

Reply