MST

星途 面试题库

面试题:Python使用任意数量关键字实参优化装饰器设计模式

在Python中,利用`**kwargs`实现一个通用的装饰器,这个装饰器可以接收任意数量的关键字参数,并能动态地修改被装饰函数的行为。例如,当传入`log=True`关键字参数时,装饰器要在被装饰函数执行前后打印日志信息;当传入`cache=True`关键字参数时,装饰器要实现对被装饰函数结果的缓存功能(可以使用简单的字典缓存)。请详细说明实现思路并给出完整代码。
49.5万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 定义一个装饰器函数,它接受**kwargs参数,以便接收任意数量的关键字参数。
  2. 在装饰器函数内部,定义一个内部函数,该内部函数将作为被装饰函数的替代。
  3. 对于log=True的情况,在内部函数中使用print在被装饰函数执行前后打印日志信息。
  4. 对于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))