Discuss / Python / 完整版@log和@log(arg)

完整版@log和@log(arg)

Topic source

最帅的仔

#1 Created at ... [Delete] [Delete and Lock User]
import time, functools
from types import FunctionType, MethodType

def log(arg):
    flag = hasattr(arg, '__call__') or isinstance(arg, (FunctionType, MethodType))
    def inner(func):
        functools.wraps(func)
        def wrapper(*args, **kw):
            start = time.time()
            print(f'方法<{func.__name__}>使用装饰器<log>') if flag else print(f'方法<{func.__name__}>使用装饰器<log("{arg}")>')
            ret = func(*args, **kw)
            print('----------------输入时间----------------')
            print(time.time() - start)
            print('----------------结束----------------')
            return ret
        return wrapper
    return inner(arg) if flag else inner

@log
def logN(arg):
    time.sleep(0.1024)
    print(arg)

logN('装饰器log')

@log('测试')
def logP(arg):
    time.sleep(0.3018)
    print(arg)

logP('装饰器log("测试")')


# 执行结果:
# 方法<logN>使用装饰器<log>
# 装饰器log
# ----------------输入时间----------------
# 0.10935568809509277
# ----------------结束----------------    
# 方法<logP>使用装饰器<log("测试")>       
# 装饰器log("测试")
# ----------------输入时间----------------
# 0.30973076820373535
# ----------------结束---------------- 

  • 1

Reply