Python 装饰器进阶指南:打造可配置的日志系统,从语法糖到实战利器
一、引言:从语法糖到架构支柱
在 Python 的世界里,装饰器不仅是一种语法糖,更是一种设计哲学。它让我们在不修改原函数的前提下,为其添加功能,提升代码的可维护性与可扩展性。从最初的日志记录,到权限控制、性能分析、缓存机制,装饰器已成为 Python 架构设计中的重要一环。
本文将聚焦一个实用而常见的需求:构建一个可配置的日志装饰器,它不仅能记录函数执行,还能根据传入的日志级别(如 INFO、DEBUG、ERROR)灵活调整输出内容。我们将从基础语法讲起,逐步深入到装饰器工厂函数的实现机制,并结合真实项目场景,展示其在自动化、数据处理、Web 应用中的应用价值。
二、装饰器的基础回顾:不动原函数,增强功能
在正式进入“带参数的装饰器”之前,我们先回顾一下装饰器的基本结构。
示例:基础日志装饰器
def log_execution(func):
def wrapper(*args, **kwargs):
print(f"[INFO] 正在执行函数:{
func.__name__}")
result = func(*args, **kwargs)
print(f"[INFO] 函数 {
func.__name__} 执行完毕")
return result
return wrapper
@log_execution
def greet(name):
print(f"你好,{
name}!")
greet("Python 爱好者")
这段代码展示了装饰器的核心理念:函数接收函数并返回函数。但它存在一个局限——日志级别是写死的,无法灵活配置。
三、目标升级:让装饰器接受参数
我们希望实现如下调用方式:
@log_execution(level='DEBUG')
def process_data(data):
...
这意味着 log_execution 不再是一个直接接收函数的装饰器,而是一个返回装饰器的工厂函数。这就涉及到装饰器的三层嵌套结构。
四、实现:带参数的日志装饰器
完整代码示例
from functools import wraps
import time
def log_execution(level='INFO'):
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs

最低0.47元/天 解锁文章
771

被折叠的 条评论
为什么被折叠?



