推荐答案
// www.javascriptcn.com code example
import functools
import logging
# 配置日志记录
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
def log_decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
logging.info(f"Function {func.__name__} started with args: {args}, kwargs: {kwargs}")
result = func(*args, **kwargs)
logging.info(f"Function {func.__name__} finished with result: {result}")
return result
return wrapper
# 使用装饰器
@log_decorator
def add(a, b):
return a + b
# 测试
add(3, 5)本题详细解读
1. 装饰器的作用
装饰器是Python中一种强大的工具,用于修改或扩展函数的行为。通过装饰器,我们可以在不修改原函数代码的情况下,为函数添加额外的功能,例如日志记录、性能测试、权限校验等。
2. 日志记录装饰器的实现
在上述代码中,我们定义了一个名为log_decorator的装饰器。这个装饰器的作用是在函数执行前后记录日志。
functools.wraps(func): 这个装饰器用于保留原函数的元信息(如函数名、文档字符串等),避免在使用装饰器后丢失这些信息。wrapper(*args, **kwargs): 这是装饰器的内部函数,它接收任意数量的位置参数和关键字参数。在这个函数中,我们首先记录函数开始执行的日志,然后调用原函数并记录其返回值,最后返回原函数的结果。
3. 日志配置
我们使用logging.basicConfig来配置日志记录的基本设置:
level=logging.INFO: 设置日志级别为INFO,这意味着只有INFO级别及以上的日志会被记录。format='%(asctime)s - %(name)s - %(levelname)s - %(message)s': 设置日志的格式,包括时间、日志名称、日志级别和日志消息。
4. 使用装饰器
通过在函数定义前添加@log_decorator,我们将log_decorator装饰器应用到add函数上。这样,每次调用add函数时,都会自动记录日志。
5. 测试
调用add(3, 5)时,日志记录器会输出类似以下的日志:
2023-10-01 12:00:00,000 - root - INFO - Function add started with args: (3, 5), kwargs: {}
2023-10-01 12:00:00,001 - root - INFO - Function add finished with result: 8通过这种方式,我们可以轻松地为任何函数添加日志记录功能,而无需修改函数本身的代码。