文章目录
- 需求:
- 方案
- 解析
需求:
我们想编写一个装饰器为被包装的函数添加额外的参数。但是,添加的参数不能影响到该函数已有的调用约定
方案
from functools import wrapsdef 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)