Discuss / Python / 交作业

交作业

Topic source

tangdoubley

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

第一题:通过datetime类求时间差即可

import datetime, time, functools
def metric(func):
    @functools.wraps(func)
    def wrapper(*args, **kw):
        start = datetime.datetime.now()
        result = func(*args, **kw) #不能直接返回执行结果,不然执行时间不对
        end = datetime.datetime.now()
        print('%s execute in %s ms ' % (func.__name__, end - start))
        return result #最后必须返回执行结果
    return wrapper

第二题:

def log(func):
    @functools.wraps(func)
    def wrappers(*args, **kw):
        print('begin call %s' % func.__name__)
        result = func(*args, **kw)
        print('end call %s' % func.__name__)
        return result
    return wrappers

第三题:没有想到好的办法,看到有的小伙伴,用了默认参数和None貌似定义是这样@log(), 好像不符题意

def log(arg):
    if not isinstance(arg, str):
        @functools.wraps(arg)
        def wrappers(*args, **kw):
            print('%s()' % arg.__name__)
            return arg(*args, **kw)
        return wrappers
    else:
        def decorator(func):
            print('11')
            @functools.wraps(func)
            def wrappers(*args, **kw):
                print('%s %s()' % (arg, func.__name__))
                return func(*args, **kw)
            return wrappers
        return decorator

tangdoubley

#2 Created at ... [Delete] [Delete and Lock User]
  • 看到一个小伙伴写的第三题,感觉比较好,通过在返回过程选择不同的返回函数,因为@log`@log('test')只是返回的函数不一样
def log(arg):
    def decorator(func):
        @functools.wraps(func)
        def wrappers(*args, **kw):
            if arg != None:
                print('%s call %s' % (arg, func.__name__))
            else:
                print('call %s' % func.__name__)
            return func(*args, **kw)
        return wrappers
    if isinstance(arg, str): 
        return decorator
    else:
        return decorator(arg)

if arg != None: 应该是if arg != func:

请问一下,你这个三层循环,@log('arg')相当于log('arg')(func),那么@log()相当于什么呢?

@log()应该相当于 log(func)吧 可以在log里面print (arg),结果是:<function now at 0x7f09e8870950>


  • 1

Reply