MST

星途 面试题库

面试题:Python闭包在装饰器中的优化应用

已知装饰器本质上是一个闭包函数,现在有一个简单的函数`def add(a, b): return a + b`,请使用闭包原理实现一个装饰器,该装饰器能够在函数执行前打印开始时间,执行后打印结束时间,同时能够处理函数可能出现的异常,并将异常信息记录到日志文件中。说明闭包在这个装饰器实现中的关键作用。
36.5万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试
import time
import logging

# 配置日志
logging.basicConfig(filename='error.log', level=logging.ERROR)


def log_time_and_error(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        print(f"开始时间: {time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(start_time))}")
        try:
            result = func(*args, **kwargs)
        except Exception as e:
            logging.error(f"函数 {func.__name__} 发生异常: {str(e)}")
            raise
        end_time = time.time()
        print(f"结束时间: {time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(end_time))}")
        return result

    return wrapper


@log_time_and_error
def add(a, b):
    return a + b


闭包在这个装饰器实现中的关键作用在于:

  1. 保存状态:装饰器函数log_time_and_error返回的内部函数wrapper记住了外部函数log_time_and_error的参数func。这使得wrapper函数在被调用时,能够调用原来的add函数,同时执行额外的时间记录和异常处理逻辑。如果没有闭包,wrapper函数就无法直接访问到func这个外部函数的局部变量。
  2. 封装性:闭包将额外的功能(时间记录和异常处理)与原函数add封装在一起,使得原函数不需要关心这些额外逻辑,实现了功能的分离和代码的简洁性。