Discuss / Python / 练习+小结

练习+小结

Topic source

烈可烈

#1 Created at ... [Delete] [Delete and Lock User]

练习:请设计一个decorator,它可作用于任何函数上,并打印该函数的执行时间(耗费)、此外,在函数执行前后打印指定语句。

def metric(fn):
    @functools.wraps(fn)
    def wrapper(*args, **kwargs):
        print('begin call')
        time_begin = time.clock()
        result = fn(*args, **kwargs)
        print('end call')
        time_end = time.clock()
        print('%s executed in %s ms' % (fn.__name__, time_end - time_begin))
        return result

    return wrapper

这里请注意理解wrapper里的fn(*args, **kwargs),你不return它的值,则等于最后是得不到fn(*args, **kwargs)方法的返回值的(除非它并不返回东西,那才没影响)。

小结:decorate支持无 参数、有参数的情况

def log(text=None):
    def decorate(func):
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            if not text:
            print('函数', func.__name__, '被调用了')
        else:
            print('函数', func.__name__, '被调用了,额外信息是:', text)
            return func(*args, **kwargs)
        return wrapper
    return decorate

测试:

@log()
def f():
    print('酱油')

f()

def f():
    print('生抽')

log()(f)()

@log('大家好我是额外')
def f():
    print('老抽')
 f()

建议:最好多自己玩几遍这种log()(f)()的调试,就能比较清晰的感受到这个装饰器里里外外到底返回了什么

暴躁的你

#2 Created at ... [Delete] [Delete and Lock User]

import time

def log(argv=None): def decorator(func): def wrapper(args, **kwargs): start = time.time() 1000 ret = func(args, **kwargs) end = time.time() 1000 if isinstance(argv, str): print('%s take %d ms' % (argv, end - start)) else: print('take %d ms' % (end - start)) return ret

    return wrapper

if isinstance(argv, str):
    return decorator
else:
    return decorator(argv)

@log def test(argv): time.sleep(argv)

if name == 'main': test(1)


  • 1

Reply