2016-04-10 25 views
4

Yürütme süresini ölçen bir dekoratörüm var ve işlev adını saatle birlikte yazdırmak istiyorum. Bu, function.__name__'u kullanabileceğim kadar tipik bir özellik. Zor olan bölüm, aşağıdaki formatta olan başka bir dekoratör iliştirdiğim zamandır. Bu durumda Python: Bir işlev içindeki bir işlevin bir işlev içindeki ismini döndürür.

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

ben sarıcı fonksiyonunda f.__name__ yazdırmak ve ben f.__name__ için olsun değer sarıcı(). Değerin, dekore edilmiş işlev adı olmasını isterim. Bunu yapmanın bir yolu var mı?

Örnek:

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 

cevap

4

el __name__ yeniden atamak olabilir, ya da sadece sizin için ve bir çift ilişkili şeyler yapmak için functools.wraps kullanabilirsiniz: Bunun için

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

teşekkürler yığınlar. Wraps (f) dekoratör mükemmel çalıştı. – Cameron

İlgili konular