Discuss / Python / exam

# exam

# 请设计一个decorator,它可作用于任何函数上,并打印该函数的执行时间:

import functools def metric(fn):     @functools.wraps(fn)     def wrapper(*args, **kw):         start = time.time()         ret = fn(*args, **kw)         print('%s executed in %s ms' % (fn.__name__, time.time()-start))         return ret     return wrapper

# 请编写一个decorator,能在函数调用的前后打印出'begin call'和'end call'的日志

import functools def metric(f):     @functools.wraps(f)     def wrapper(*args, **kw):         print ('begin call')         ret = f(*args, **kw)         print ('end call')         return ret     return wrapper @metric def f1(x):     x**x print(f1(8))

#再思考

import functools def log(*n):     if isinstance(n,tuple):         def decorator(fn):             @functools.wraps(fn)             def wrapper(*args, **kw):                 print('okay')                 return fn(*args, **kw)             return wrapper         return decorator     else:         @functools.wraps(n)         def wrapper(*args, **kw):             print('okay')             return n(*args, **kw)         return wrapper

其实可以不使用isintance,更简单

import functools

def log(*n):

    if n==None:

        @functools.wraps(n)

        def wrapper(*args, **kw):

            print('okay')

            return n(*args, **kw)

        return wrapper  

    else:

        def decorator(fn):

            @functools.wraps(fn)

            def wrapper(*args, **kw):

                print('okay')

                return fn(*args, **kw)

            return wrapper

        return decorator


  • 1

Reply