Python3 装饰器

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

再思考一下能否写出一个@log的decorator,使它既支持:

@log

def f():

    pass


又支持:

@log('execute')

def f():

    pass



import functools

import time

def log(text=None):

    def decorator(func):

        @functools.wraps(func)

        def wrapper(*args, **kw):

            if isinstance(text, (int, str)):

                print('%s begin call %s():' % (text, func.__name__))

                f = func(*args, **kw)

                print('%s end call %s():' % (text, func.__name__))

            else:

                print('begin call %s():' % func.__name__)

                f = func(*args, **kw)

                print('end call %s():' % func.__name__)

            return f

        return wrapper

    return decorator if isinstance(text, (int, str)) else decorator(text)

@log

def now():

    print('now is:' + time.asctime())


@log('timeshow')

def now2():

    print('now is:' + '2019-10-25')

now()

now2()

你可能感兴趣的:(Python3 装饰器)