问题
怎么编写一下可以接受参数的装饰器
解决方案
我们想编写一个可以为函数添加日志功能的装饰器,但是又允许用指定日志的级别及其它细节。
from functools import wraps
import logging
def logged(level, name=None, message=None):
"""
some explain.
:param level:
:param name:
:param message:
:return:
"""
def decorator(func):
logname = name if name else func.__module__
log = logging.getLogger(logname)
logmsg = message if message else func.__name__
@wraps(func)
def wrapper(*args, **kwargs):
log.log(level, logmsg)
return func(*args, **kwargs)
return wrapper
return decorator
@logged(logging.CRITICAL)
def add(x, y):
return x + y
@logged(logging.CRITICAL, "example")
def spam():
print("spam...")
if __name__ == '__main__':
print(add(2, 3))
spam()
结果
C:\Users\tianming\AppData\Local\Programs\Python\Python37-32\python.exe H:/test/acp_para_decorator.py
5
spam...
add
spam
Process finished with exit code 0
discuss
我们可以看到装饰的过程为:
func = decorator(x,y,z)(func)
即:装饰器必须返回一个可调用的对象,这个对象然后接受一个函数作为输入,并对其进行包装。