2017-04-25 2 views
3

Grundsätzlich Ich versuche, eine Timing-Dekorateur zu implementieren:Dekorateure - versuchen Sie dieses einfache Beispiel zu verstehen

def laptime(func): 
    def inner(*args): 
     start = time.time() 
     r = func(*args) 
     print time.time()-start 
    return r 

@laptime 
def loop(a,b): 
    for i in range(a,b): 
     print (i) 

loop(2, 1000) 

ich viele Möglichkeiten, es versucht, arbeiten, aber sie alle Erträge lustige Ergebnisse, die ich nicht verstehe, ... Ich weiß, dass es viele andere Fragen zum Thema SO gibt, aber irgendwie waren sie für mich nicht hilfreich, um besser zu verstehen, wie das gemacht werden sollte.

Antwort

6

Eine Decorator-Funktion übernimmt eine Funktion als Argument und gibt eine modifizierte Funktion zurück. Ihr laptime gibt die geänderte Funktion (inner) nicht zurück, und es hat die falsche Einrückung auf return r.

Hier ist eine reparierte Version. Ich habe mich verändert es auch so ist es sowohl korrekt auf Python laufen 2 & Python 3.

import time 

def laptime(func): 
    def inner(*args): 
     start = time.time() 
     r = func(*args) 
     print(time.time() - start) 
     return r 
    return inner 

@laptime 
def loop(a,b): 
    for i in range(a,b): 
     print(i) 

loop(2, 10) 

Ausgang

2 
3 
4 
5 
6 
7 
8 
9 
0.000479936599731 

Die @decorator Syntax zunächst ein wenig geheimnisvoll sein kann, aber du gewöhnst dich irgendwann daran. :)

Doing

@laptime 
def loop(a,b): 
    for i in range(a,b): 
     print(i) 

auf diese völlig gleichwertig ist:

def loop(a,b): 
    for i in range(a,b): 
     print(i) 

loop = laptime(loop) 
+0

Ja, ich denke, dass ich ein bisschen besser undestand jetzt ... Bis zum nächsten Mal! Danke –

Verwandte Themen