如何实现条件装饰器解决函数违反DRY原则的重复状态打印问题?
实现状态日志装饰器解决DRY问题
首先,我们需要一个带参数的装饰器,因为要传入具体的state值,让不同函数能复用这套状态日志逻辑。
完整实现代码
def status_logger(state: str): def decorator(func): def wrapper(*args, **kwargs): print(f"change {state} to pending") try: # 执行原函数的核心业务逻辑 result = func(*args, **kwargs) print(f"change {state} to success") return result except BaseException: print(f"change {state} to error") # 可选:重新抛出异常,避免吞掉错误让上层无法感知 raise return wrapper return decorator
使用示例
现在业务逻辑可以彻底简化,只保留核心功能:
@status_logger(state="order") def process_order(): # 这里写原来try块内的核心逻辑,比如更新订单数据、调用物流接口等 print("executing order processing...") @status_logger(state="payment") def process_payment(): # 核心支付处理逻辑 print("executing payment processing...") # 模拟异常,测试error分支(注释掉即可看success流程) # raise ValueError("insufficient balance")
逻辑说明
status_logger是外层参数接收函数,负责传递state给内层装饰器decorator接收被装饰的业务函数funcwrapper包裹完整执行流程:- 先打印初始
pending状态 - 执行原函数的核心逻辑
- 执行成功则打印
success,触发异常则打印error
- 先打印初始
- 所有状态日志逻辑统一由装饰器处理,业务函数无需重复编写打印代码,完全符合DRY原则
内容的提问来源于stack exchange,提问作者AidarDzhumagulov
相关产品推荐
相关产品推荐

