2017-11-20 3 views
0

で装飾された関数の引数を渡す方法を私は<name>の代わりに私が飾ら機能である名前を渡したい、デコレータでデコレータ

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

以下のコードを持っています。

newrelicがパッケージを時々更新するので、私はデコレータを変更/上書きしたくないことに注意してください。これは私たちにとって問題になるでしょう。

任意の解決策

答えて

0

デコレータは単なるラッパー関数です。

newrelic.agent.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 

言う新しい遺物は、として定義data_store_trace

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)