You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现条件装饰器解决函数违反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接收被装饰的业务函数func
  • wrapper包裹完整执行流程:
    1. 先打印初始pending状态
    2. 执行原函数的核心逻辑
    3. 执行成功则打印success,触发异常则打印error
  • 所有状态日志逻辑统一由装饰器处理,业务函数无需重复编写打印代码,完全符合DRY原则

内容的提问来源于stack exchange,提问作者AidarDzhumagulov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 02:54:24