Ich versuche, über Python Dekorateure zu lernen, und ich möchte genau im Detail verstehen, wie Verschluss, beispielsweise in diesem memoization Zusammenhang gilt:Verständnis eines memoization Dekorateur als Verschluss
def memoize(f):
memo = {}
def helper(x):
if x not in memo:
memo[x] = f(x)
return memo[x]
return helper
@memoize
def fib(n):
if n in (0,1):
return n
return fib(n - 1) + fib(n - 2)
I verstehen, dass memoize
Funktionen zurückgibt, die an memo
Werte im umschließenden Bereich helper
gebunden sind, auch wenn der Programmablauf nicht mehr in diesem umschließenden Bereich ist. Wenn also memoize
wiederholt aufgerufen wird, wird eine variierende Folge von Funktionen zurückgegeben, abhängig von den aktuellen Werten von memo
. Ich verstehe auch, dass @memoize
ist syntaktischer Zucker, der Aufrufe an fib(n)
durch Aufrufe an memoize(fib(n))
ersetzt wird.
Wo ich zu kämpfen habe ist, wie der genannte Wert von n
in fib(n)
wirksam auf die x
in helper(x)
umgewandelt wird. Die meisten Tutorials zu Schließungen scheinen diesen Punkt nicht explizit zu machen, oder sie sagen eher vage, dass eine Funktion sich über die andere schließt, was sie nur magisch klingen lässt. Ich kann sehen, wie man die Syntax benutzt, möchte aber besser verstehen, was genau hier passiert und welche Objekte und Daten beim Ausführen des Codes weitergegeben werden.
_ "wie der aufgerufene Wert von n in fib (n) effektiv in das x in Helfer umgewandelt wird (x)" _? Ich denke du hast das rückwärts. Wenn jemand zum Beispiel 'fib (5)' aufruft, heißt das eigentlich 'helper (5)', also ist 'x'' 5'. "Helfer" ruft dann (das reale) "fib", d. h. "memo [5] = f (5)", auf, so dass nun "n" auch "5" ist. Dies sind normale Funktionsaufrufe. Es ist absolut keine Magie beteiligt. –
Ich habe die außergewöhnlich gute Antwort zu diskutieren Dekoratoren bei (http://stackoverflow.com/questions/739654/how-can-i-make-a-chain-of-function-decorators-in-python/1594484#1594484), aber das scheint meine besondere Schwierigkeit nicht zu lösen. – MichaelMaggs
@MichaelMaggs: Sie haben missverstanden, wie Dekoratoren funktionieren, Sie sollten diesen Beitrag vielleicht noch einmal lesen. –