2011-02-03 2 views
12

вот мой декоратор:Получите имя украшенной функции?

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 

Вот завернутые функция:

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

Если я collect_data.__name__ я получаю wrapper вместо collect_data

Любые идеи?

ответ

3

В дополнение к functools.wraps, вы можете проверить decorator модуль, который был разработан, чтобы помочь с этой проблемой.

+0

Но это не в stdlib – rubik

+0

Также нет Django. – tkerwin

18

functools.wraps не требуется! Просто используйте 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() 

Выходы:

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

В случае OP, 'functools.wraps' не требуется, вы правы, хотя использование его по-прежнему является лучшим подходом в большинстве (других) случаях. –

0

Для тех, кто должен получить доступ к декорированное имя функции, когда есть несколько декораторы, как это:

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

functools.wraps упоминалось выше Решает что.

Смежные вопросы