2011-02-03 92 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 2011-02-03 15:19:04

+0

Django也不是。 – tkerwin 2011-02-04 03:16:21

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

的人谁需要访问装饰函数名,当有多个装饰,就像这样:

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

上面解决了提到functools.wraps那。