懒人必备,五个高效Python装饰器

懒人必备,五个高效Python装饰器
最新回答
如一

2021-05-15 19:55:29

以下是五个高效实用的Python装饰器示例,它们能显著提升代码清洁度和开发效率:

1. 计时器装饰器(Timer)

核心功能:自动测量函数执行时间,适用于性能优化场景。

import timedef timer(func): def wrapper(*args, kwargs): start_time = time.time() result = func(*args, kwargs) execution_time = time.time() - start_time print(f"Execution time: {execution_time:.4f} seconds") return result return wrapper@timerdef train_model(): time.sleep(2) # 模拟耗时操作 return "Training completed"# 输出示例:Execution time: 2.0003 seconds2. 调试器装饰器(Debugger)

核心功能:自动打印函数调用参数和返回值,加速调试过程。

def debug(func): def wrapper(*args, kwargs): print(f"Calling {func.__name__} with args: {args}, kwargs: {kwargs}") result = func(*args, kwargs) print(f"{func.__name__} returned: {result}") return result return wrapper@debugdef calculate_sum(a, b): return a + b# 输出示例:# Calling calculate_sum with args: (3, 5), kwargs: {}# calculate_sum returned: 83. 异常处理器装饰器(Exception Handler)

核心功能:统一捕获和处理函数异常,避免重复try-except代码块。

def exception_handler(func): def wrapper(*args, kwargs): try: return func(*args, kwargs) except Exception as e: print(f"Error in {func.__name__}: {str(e)}") # 可添加日志记录或回退操作 return wrapper@exception_handlerdef divide(a, b): return a / b# 输出示例:Error in divide: division by zero4. 输入验证器装饰器(Input Validator)

核心功能:自动验证函数参数类型/范围,确保数据有效性。

def validate_input(*validations): def decorator(func): def wrapper(*args, kwargs): for i, (arg, validation) in enumerate(zip(args, validations)): if not validation(arg): raise ValueError(f"Invalid argument {i}: {arg}") return func(*args, kwargs) return wrapper return decorator@validate_input(lambda x: x > 0, lambda y: isinstance(y, str))def process_data(number, text): return f"{text} {number}"# 合法调用:process_data(5, "Value")# 非法调用会抛出:ValueError: Invalid argument 0: -15. 重试机制装饰器(Retry)

核心功能:自动重试失败的网络请求/API调用,增强程序健壮性。

import timedef retry(max_attempts=3, delay=1): def decorator(func): def wrapper(*args, kwargs): for attempt in range(max_attempts): try: return func(*args, kwargs) except Exception as e: if attempt == max_attempts - 1: raise print(f"Attempt {attempt + 1} failed, retrying in {delay}s...") time.sleep(delay) return wrapper return decorator@retry(max_attempts=3, delay=2)def fetch_data(): import random if random.random() < 0.7: # 模拟70%失败率 raise ConnectionError("Network error") return "Data fetched"# 可能输出:# Attempt 1 failed, retrying in 2s...# Attempt 2 failed, retrying in 2s...# (最终成功或抛出异常)

应用建议

  1. 组合使用:多个装饰器可叠加使用(如@timer @exception_handler)
  2. 参数化装饰器:通过闭包实现灵活配置(如@retry(max_attempts=5))
  3. 类装饰器:对于需要维护状态的场景,可使用类实现装饰器
  4. 性能考量:简单函数避免过度使用装饰器,可能增加调用开销

这些装饰器覆盖了日志记录、错误处理、性能监控等常见需求,通过20行以内的代码即可实现核心功能,是提升Python开发效率的利器。