2016-04-10 14 views
4

実行時間を測定するデコレータがあります。関数名も時間とともに表示したいと思います。私はちょうどfunction.__name__を使うことができるので、通常は十分簡単です。トリッキーな部分は、次の形式の別のデコレータを添付するときです。この場合Python:関数内の関数内の関数の名前を返します。

def retry_until(desired_return_value, retries=0): 
    def decorator(f): 
     def wrapper(*args, **kwargs): 

)(Iは、ラッパー関数でf.__name__を印刷し、私はf.__name__ために得る値は、ラッパーです。値を装飾されている関数名にしたいと思います。これを行う方法はありますか?

例:

def get_execution_time(f): 
    def wrapper(*args, **kwargs): 
     start_time = time.time() 
     ret = f(*args, **kwargs) 
     print(f.__name__ + "() completed in %s seconds" % (time.time() - start_time)) 
     return ret 
    return wrapper 

@get_execution_time 
def test(): # Function name is "test" 
    pass 

@get_execution_time 
@retry_until(False, 2) 
def test(): # Function name is "wrapper", the inner-most function in retry_until 
    pass 

答えて

4

は手動__name__を再割り当てすることができ、またはあなたがあなたのためだけにその夫婦関連の事をするfunctools.wrapsを使用することができます。そのため

import functools 
def retry_until(desired_return_value, retries=0): 
    def decorator(f): 
     @functools.wraps(f) 
     def wrapper(*args, **kwargs): 
      ... 
+0

おかげでヒープを。ラップ(f)デコレータは完璧に動作しました。 – Cameron

関連する問題