Python rücksetzbare Instanzmethode Memoization Decorator

8

Ich versuche, einen Decorator für eine Instanzmethode einer Klasse zu erstellen, die das Ergebnis protokolliert. (Dies wurde schon millionenmal gemacht.) Allerdings hätte ich gerne die Möglichkeit, den Memo-Cache jederzeit zurückzusetzen (zB wenn sich etwas im Instanz-Zustand ändert, was das Ergebnis der Methode möglicherweise verändern würde) mit seinen Argumenten zu tun). Also habe ich versucht, einen Decorator als eine Klasse anstelle einer Funktion zu erstellen, so dass ich als Klassenmitglied Zugriff auf den Cache haben könnte. Dies führte mich auf den Pfad des Lernens über Deskriptoren, insbesondere die __get__ -Methode, wo ich eigentlich feststecke. Mein Code sieht so aus:

%Vor%

Ist das klar und / oder möglich? Jedes Mal, wenn __get__ aufgerufen wird, erhalte ich eine brandneue Instanz der memoisierten Klasse, die den Cache mit den darin enthaltenen Daten verliert. Ich habe hart mit __get__ gearbeitet, aber mache keine großen Fortschritte.

Gibt es einen völlig separaten Zugang zu diesem Problem, den ich komplett vermisse? Und alle Ratschläge / Vorschläge sind willkommen und geschätzt. Danke.

    
Hoopes 13.12.2010, 17:38
quelle

3 Antworten

6

Anstatt zu versuchen, die Mechanismen Ihrer Implementierung auszuarbeiten, habe ich die Klasse memoized decorator aus PythonDecoratorLibrary <übernommen / a>, und habe es so modifiziert, dass reset hinzugefügt wurde. Unten ist das Ergebnis; Der Trick, den ich verwendet habe, besteht darin, der dekorierten Funktion selbst ein aufrufbares reset -Attribut hinzuzufügen.

%Vor%     
NPE 13.12.2010, 17:59
quelle
2

Aufbauend auf der Antwort auf die ursprüngliche Frage von @ aix habe ich eine Klasse erstellt, von der ich denke, dass sie sie verbessern könnte. Das Hauptmerkmal ist, dass die zwischengespeicherten Werte als eine Eigenschaft der Instanz gespeichert werden, deren Methode dekoriert wird, daher ist es sehr einfach, sie zurückzusetzen.

%Vor%

Als ein Anwendungsbeispiel:

%Vor%

wird als Ausgabe ausgegeben:

%Vor%     
Biel Cardona 25.12.2011 11:44
quelle
0

Nun möchte ich auf zwei Leistungsprobleme in Ihrem Code hinweisen. Dies ist keine Antwort auf Ihre Frage, aber ich kann es nicht kommentieren. Danke an @delnan für den Hinweis, dass has_key veraltet ist. Statt:

%Vor%

Ich würde es so machen:

%Vor%

Dies vermeidet: a) try / except KeyError ; b) Aufruf von cache[key] bei Rückgabe; c) erneutes Aufrufen der Funktion auf nicht ausdehnbaren Tasten.

    
khachik 13.12.2010 18:11
quelle