场景:想写一个装饰器,既可以不传参数给它,比如 @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()
网友评论