Python,有条件地使用装饰器(未在所有环境中安装包)

标签 python decorator newrelic

我正在使用 New Relic 来监视我的 Python (2.7) 应用程序,但仅限于我的生产环境。我想使用他们的 function_trace 装饰器。

在wsgi.py中

try:
    import newrelic.agent
    newrelic.agent.initialize('/path/')
except Exception as e:
    pass

在views.py中

if settings.ENV == "test":
    pass
else:
    import newrelic

@newrelic.agent.function_trace()
def my_function():
    ....

当然,这在生产中效果很好,但在测试中失败了。我不能将 if-else 直接放在装饰器周围,所以我想我可以使用条件装饰器:

def newrelic_conditional_decorator(function)
    # What magic goes in here...
    if settings.ENV == "test":
        just return function
    else:
        use @newrelic.agent.function_trace() decorator

@newrelic_conditional_decorator
def my_function():
    ....

我对装饰器总是有点模糊,所以我希望在这里得到一些帮助! (或者另一种处理测试中与生产中没有相同包的方法。)

最佳答案

装饰器接受一个函数并从中返回一个新函数。因此,如果您想要一个条件装饰器,您只需在不希望应用装饰器时返回初始函数即可。

您的具体案例

def newrelic_conditional_decorator(function):

    if settings.ENV == "test":
        # We do not apply the decorator to the function
        return function
    else:
        # We apply the decorator and return the new function
        return newrelic.agent.function_trace()(function)

@newrelic_conditional_decorator
def my_function():
    ...

一些一般性

您可以将其抽象为一个更通用的条件装饰器,该装饰器应用给定的生成器,前提是某些condition函数返回True

def conditional_decorator(decorator, condition, *args):

    def wrapper(function):
        if condition(*args):
            return decorator(function)
        else:
            return function

    return wrapper

@conditional_decorator(
    newrelic.agent.function_trace(),
    lambda settings: settings.ENV != "test",
    settings)
def my_function():
    ...

关于Python,有条件地使用装饰器(未在所有环境中安装包),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49203954/

相关文章:

python解析/处理文件夹中的所有xml文件

Java 装饰器模式 : Can I decorate a protected method?

python - 使用参数验证 Python 数据转换以获得预期结果

ios - 新遗物安装错误: Our installation process has changed,请看https:

swift - 使用桥接头创建 Pod

ios - 沉默 NewRelic 日志记录到控制台

python - 将 python image.transform 转换为 C++ cv::transform

python,在pexpect中设置终端类型

python - 使用 CIGAR 推断序列的长度

python - 如何装饰子类中的所有继承方法