如何在decorator中传递装饰函数参数

时间:2017-11-20 11:27:41

标签: python newrelic python-decorators

我的代码如下

@newrelic.agent.data_store_trace('Mysql', '<name>',None)
def get_user(request=None, name=settings.DEFAULT_NAME):
    # Some implementation

在装饰器中,代替<name>我想传递装饰函数中的名称。

请注意,我不想修改/覆盖装饰器,因为newrelic会不时更新包装,这对我们来说是个问题。

任何解决方案???

1 个答案:

答案 0 :(得分:0)

装饰器只是包装函数。

编写另一个包装newrelic.agent.data_store_trace的包装函数,并允许传递名称。

Say New Relic将data_store_trace定义为:

import functools


def data_store_trace(product, target, operation):
  def wraps(fn):
    @functools.wraps(fn)
    def wrapped(*args, **kwargs):
      print('Tracing: ', fn.__name__, args, kwargs)
      return fn(*args, **kwargs)
    return wrapped
  return wraps

添加另一个间接级别将给出:

def data_store_trace_with_name(product, operation, target=''):
  def wraps(fn):
    @functools.wraps(fn)
    def wrapped(*args, **kwargs):
      return data_store_trace(product, target, operation)(fn)(*args, **kwargs)
    return wrapped
  return wraps

@data_store_trace_with_name('Mysql', None, '<name>')
def add(x, y):
  return x + y

add(5, 6)