需求:
我们想编写一个装饰器为被包装的函数添加额外的参数。但是,添加的参数不能影响到该函数已有的调用约定
方案
from functools import wraps
def optional_debug(func):
@wraps(func)
def wrapper(*args, debug=False, **kwargs):
if debug:
print('Calling', func.__name__)
return func(*args, **kwargs)
return wrapper
@optional_debug
def spam(a, b, c):
print(a, b, c)
>>> spam(1, 2, 3)
1 2 3
>>> spam(1, 2, 3, debug=True)
Calling spam
1 2 3
解析
@optional_debug
等于optional_debug(spam)
optional_debug(spam)
返回函数wrapper
spam
函数实际指向wrapper
函数spam(1,2,3, debug=True)
理解为wrapper(1,2,3,debug=True)