2011-02-03 7 views
12

aquí es mi decorador:Obtener el nombre de una función decorada?

def check_domain(func): 

    def wrapper(domain_id, *args, **kwargs): 
     domain = get_object_or_None(Domain, id=domain_id) 
     if not domain: 
      return None 
     return func(domain_id, *args, **kwargs) 

    return wrapper 

Aquí está una envuelta función:

@check_domain 
def collect_data(domain_id, from_date, to_date): 
    do_stuff(...) 

Si hago collect_data.__name__ consigo wrapper en lugar de collect_data

¿Alguna idea?

Respuesta

3

Además de functools.wraps, se puede extraer el módulo decorator que fue diseñado para ayudar con este problema.

+0

Pero no está en el stdlib – rubik

+0

Tampoco Django. – tkerwin

18

functools.wraps no es necesario! Sólo tiene que utilizar method.__name__

import time 

def timeit(method): 
    def timed(*args, **kw): 
     ts = time.time() 
     result = method(*args, **kw) 
     te = time.time() 
     print('Function', method.__name__, 'time:', round((te -ts)*1000,1), 'ms') 
     print() 
     return result 
    return timed 

@timeit 
def math_harder(): 
    [x**(x%17)^x%17 for x in range(1,5555)] 
math_harder() 

@timeit 
def sleeper_agent(): 
    time.sleep(1) 
sleeper_agent() 

Salidas:

Function math_harder time: 8.4 ms 
Function sleeper_agent time: 1003.7 ms 
+0

En el caso del OP, 'functools.wraps' no es necesario, tiene razón; sin embargo, utilizarlo sigue siendo el mejor enfoque en la mayoría (otros) casos. –

0

Para cualquier persona que necesite para acceder al nombre de la función decorada cuando hay múltiples decoradores, así:

@decorator1 
@decorator2 
@decorator3 
def decorated_func(stuff): 
    return stuff 

la functools.wraps mencionado anteriormente resuelve ese.

Cuestiones relacionadas