实现思路
- 定义一个装饰器函数,它接受
**kwargs
参数,以便接收任意数量的关键字参数。
- 在装饰器函数内部,定义一个内部函数,该内部函数将作为被装饰函数的替代。
- 对于
log=True
的情况,在内部函数中使用print
在被装饰函数执行前后打印日志信息。
- 对于
cache=True
的情况,使用一个字典来缓存被装饰函数的结果。每次调用函数时,先检查缓存中是否已经有结果,如果有则直接返回缓存结果,否则计算结果并缓存。
完整代码
def general_decorator(**kwargs):
cache_dict = {}
def decorator(func):
def wrapper(*args, **kwargs_inner):
if 'log' in kwargs and kwargs['log']:
print(f"开始执行函数 {func.__name__}")
if 'cache' in kwargs and kwargs['cache']:
key = (args, tuple(sorted(kwargs_inner.items())))
if key in cache_dict:
return cache_dict[key]
result = func(*args, **kwargs_inner)
cache_dict[key] = result
return result
else:
result = func(*args, **kwargs_inner)
if 'log' in kwargs and kwargs['log']:
print(f"函数 {func.__name__} 执行结束")
return result
return wrapper
return decorator
# 示例使用
@general_decorator(log=True, cache=True)
def add(a, b):
return a + b
print(add(1, 2))
print(add(1, 2))