2011-02-03 151 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那。