2014-09-14 5 views
13

Voglio importare una funzione:Applicazione di un decoratore a una funzione importata?

from random import randint 

e quindi applicare un decoratore ad esso:

@decorator 
randint 

mi chiedevo se ci fosse qualche zucchero sintattico per questo (come quello che ho sopra), o devo farlo come segue:

@decorator 
def randintWrapper(*args): 
    return random.randint(*args) 

risposta

20

decoratori sono lo zucchero sintattico per sostituire un oggetto funzione con una versione decorata, dove decorazione è solo chiamando (passando l'oggetto funzione originale). In altre parole, la sintassi:

@decorator_expression 
def function_name(): 
    # function body 

si traduce in:

def function_name(): 
    # function body 
function_name = decorator_expression(function_name) 

Nel tuo caso, è possibile applicare il decoratore manualmente invece:

from random import randint 

randint = decorator(randint) 
+2

L'unico problema è che il docstring e il nome del metodo non viene conservato. Forse vuoi usare 'functools.wraps' – pratikm

+4

@pratikm: questo è un problema separato però. Il decoratore dovrebbe infatti usare 'functools.wraps', ma questo non cambia come puoi * applicare * il decoratore. –