2016-12-19 6 views
-2

Ich habe ein Problem, diesen Code zu verstehen, den ich von Buch "Learning Python" Abschnitt Dekoratoren bekam.Verständnis dieses Python-Dekorator-Codes

Warum gibt dieser Code den Wert des Ergebnisses einmal anstatt zweimal zurück? Wir haben die Menge der Ergebnisvariablen zweimal zurückgegeben, einmal in "max_result" und eine andere in "measure"; hier ist der code:

Hier ist der Ausgang, warum bekommen wir nicht zwei 8 oder zwei 125?

>>> print(cube(2)) 
cube took: 8.106231689453125e-06 
8 
>>> print(cube(5)) 
Result is too big (125). Max allowed is 100. 
cube took: 5.91278076171875e-05 
125 
>>> 
+0

Warum denken Sie, dass Sie zwei 8 bekommen sollten? – mgilson

+0

Es sind nur drei Druckanweisungen beteiligt und jede wird höchstens einmal ausgeführt. –

+0

der boock sagt: "Auf dem zweiten Aufruf ist das Ergebnis 125, so wird die Fehlermeldung gedruckt, das Ergebnis zurückgegeben, und dann ist es die Reihenfolge, die die Laufzeit erneut druckt, und schließlich drucken wir das Ergebnis (125). so kommen wir zweimal zurück, was passiert mit einem von ihnen? – ali

Antwort

4

Die Dekorateure sind gekettet. Die ursprüngliche cube() Funktion wurde von dem max_result Dekorateur eingewickelt, und das Ergebnis dieser Dekoration wurde von measure dekoriert.

So ist der Rückgabewert von cube() durch wrapper() in max_result(), und das Ergebnis dieser Funktion genommen wird von wrapper() in measure() genommen, bevor an den Aufrufer zurückgegeben wird.

alle Dekorateure Entwirren würden Sie:

def measure_wrapper(*args, **kwargs): 
    t = time() 
    result = max_result_wrapper(*args, **kwargs) 
    print(func.__name__, 'took:', time() - t) 
    return result 

def max_result_wrapper(*args, **kwargs): 
    result = original_cube(*args, **kwargs) 
    if result > 100: 
     print('Result is too big ({0}). Max allowed is 100.' 
       .format(result)) 
    return result 

def original_cube(n): 
    return n ** 3 

cube = measure_wrapper 

So cube(2) Aufruf erzeugt:

  • measure_wrapper(2), Aufzeichnungen t = time() und ruft
    • max_result_wrapper(2), die
        direkt aufruft
      • original_cube(2), die
      • kehrt 2 ** 38
    • Tests ist 8 > 100, whichis falsch so
    • kehrt 8
  • druckt die Zeit der max_result_wrapper() Anruf entgegengenommen hat und
  • kehrt 8
+0

danke für die Antwort, ich verstehe es jetzt vollständig. – ali