Python 元编程:装饰器、元类及函数签名的高级应用
1. 编写为包装函数添加参数的装饰器
1.1 问题描述
你希望编写一个装饰器,为被包装函数的调用签名添加一个额外的参数,同时这个额外参数不能干扰函数现有的调用约定。
1.2 解决方案
可以使用仅关键字参数将额外的参数注入到调用签名中。以下是一个示例装饰器:
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)
spam(1, 2, 3, debug=True)
1.3 讨论
为包装函数的签名添加参数并非装饰器的常见用法,但在避免某些代码复制模式时可能是一种有用的技术。例如,将原本重复的 debug
参数检查代码进行重构: