In einer kürzlich erschienenen Hacker-Newsletter Problem, dieser sehr nützliche Artikel über Dekoratoren in Python verlinkt wurde. Ich mag den Artikel und ich denke, ich verstehe die meisten der Dekoratoren-Beispiele. Allerdings, in der Nicht-Dekorator Memoisierung Beispiel, ich bin sehr verwirrt durch den Code:
def memoize(fn):
stored_results = {}
def memoized(*args):
try:
# try to get the cached result
return stored_results[args]
except KeyError:
# nothing was cached for those args. let's fix that.
result = stored_results[args] = fn(*args)
return result
return memoized
Ich bin verwirrt, wie diese Funktion ein dauerhaftes Wörterbuch erstellen würde stored_results
der angehängt wird. Nach erneutem Lesen, Kopieren/Einfügen in meinen Editor und Spielen mit ihm, und online nach Hilfe suchen, verstehe ich immer noch nicht, was die Syntax stored_results[args] = fn(*args)
wirklich tut.
(1) Der Artikel schlägt vor, dass der obige Code die Funktion zurückgibt, aber dass er nun zuerst ein Wörterbuch durchsucht, bevor er auf neuen Argumenten ausgeführt wird. Wie kann dies geschehen? Warum wird nicht stored_results
nur in der Nähe von memoize
? Warum wird es nicht zerstört, wenn memoized
zurückgegeben wird?
(2) Links zu anderen Fragen oder Webressourcen, die das hier dargelegte Argument mit *args
wäre ebenfalls hilfreich. Wenn *args
ist eine Liste von Argumenten, warum können wir die Syntax stored_results[args]
wenn Sie normalerweise einen nicht verschlüsselbaren Fehler erhalten, wenn Sie versuchen, ein Wörterbuch auf einer Liste zu indizieren?
Danke für alle klärenden Gedanken.