2011-02-03 18 views
12

tutaj jest mój dekorator:Uzyskaj nazwę udekorowanej funkcji?

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 

Oto zawinięta funkcja:

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

Jeśli robię collect_data.__name__ uzyskać wrapper zamiast collect_data

Jakieś pomysły?

Odpowiedz

3

Oprócz functools.wraps, można sprawdzić moduł decorator który został zaprojektowany, aby pomóc z tym problemem.

+0

Ale nie jest na stdlib – rubik

+0

Nie jest też Django. – tkerwin

18

functools.wraps nie jest potrzebny! Wystarczy użyć 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() 

Wyjścia:

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

W przypadku OP 'functools.wraps' nie jest potrzebny, masz rację - chociaż używanie go nadal jest lepszym rozwiązaniem w większości (innych) przypadków. –

0

Dla każdego, kto potrzebuje dostępu do zdobione nazwy funkcji, gdy istnieje wiele dekoratorzy, tak:

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

functools.wraps wspomniano powyżej rozwiązuje że.