带可选参数的装饰器

2019-02-19  本文已影响0人  noteby

场景:想写一个装饰器,既可以不传参数给它,比如 @decorator , 也可以传递可选参数给它,比如 @decorator(x,y,z) 。

from functools import wraps, partial
import logging


def logged(func=None, level=logging.DEBUG, name=None, message=None):
    if func is None:
        return partial(logged, level=level, name=name, message=message)

    logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    log_name = name if name else func.__module__
    log = logging.getLogger(log_name)

    @wraps(func)
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        log.log(level, result)
        return result

    return wrapper


@logged
def add(x, y):
    return x + y


@logged(level=logging.CRITICAL, name='example')
def delete():
    return 'delete success'


if __name__ == '__main__':
    add(3, 3)
    delete()
上一篇 下一篇

猜你喜欢

热点阅读