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

Python中如何自定义包装第三方装饰器并按指定条件启用

实现合理性评估

你的初步实现逻辑是可运行的,能满足「开关控制第三方装饰器是否生效」的核心需求,但存在三处可优化的问题:

  • 代码冗余:两个wrapper的业务逻辑完全一致,仅是否叠加xray装饰器的区别,重复编写提高了后续维护成本
  • 未保留原函数元信息:没有对被装饰函数的__name__、__doc__等元属性做保留,调试、打日志时会出现函数名显示为wrapper的混乱问题
  • 灵活性不足:当前xray_recorder.capture()的参数是硬编码的,无法为不同业务函数自定义传入segment名称等配置
更规范的实现方案

推荐使用带参数兼容的装饰器写法,同时引入functools.wraps处理元数据问题,实现如下:

import os
from functools import wraps
from aws_xray_sdk.core import xray_recorder

# 开关可以直接绑定环境变量,无需修改代码即可调整开关状态
CUSTOM_XRAY_WRAPPER = os.getenv("ENABLE_XRAY_CAPTURE", "false").lower() == "true"

def conditional_xray_capture(func=None, *, capture_kwargs=None):
    """
    带开关控制的xray capture装饰器
    支持两种用法:
    1. 无参数直接用:@conditional_xray_capture
    2. 传参给capture方法:@conditional_xray_capture(capture_kwargs={"name": "custom_seg"})
    """
    capture_kwargs = capture_kwargs or {}
    def decorator(f):
        @wraps(f)
        def wrapper(*args, **kwargs):
            return f(*args, **kwargs)
        # 开关开启时才叠加xray装饰器
        if CUSTOM_XRAY_WRAPPER:
            return xray_recorder.capture(**capture_kwargs)(wrapper)
        return wrapper
    # 兼容无参数调用的情况
    if func is None:
        return decorator
    return decorator(func)

使用示例

基础用法

@conditional_xray_capture
def my_business_func(a, b):
    return a + b

自定义xray segment名称

@conditional_xray_capture(capture_kwargs={"name": "calc_service_add"})
def my_business_func(a, b):
    return a + b

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 03:06:01