2017-11-20 6 views
0

Ich habe Code untenwie dekoriert Funktionsargumente in Dekorateur passiert

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

Im Dekorateur, anstelle von <name> I Namen übergeben will, die in der dekorierten Funktion ist.

Beachten Sie, dass ich den Decorator nicht ändern/überschreiben möchte, da newrelic die Pakete von Zeit zu Zeit aktualisiert. Es wäre ein Problem für uns.

Jede Lösung ???

Antwort

0

Dekorierer sind einfach Wrapper-Funktionen.

Schreiben Sie eine andere Wrapper-Funktion, die newrelic.agent.data_store_trace umschließt und ermöglicht, einen Namen zu übergeben.

Say New Relic definiert data_store_trace als:

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 

andere Dereferenzierungsebene Das Hinzufügen geben:

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) 
Verwandte Themen