Lru_cache für Klassenmethode, die von einem Klassenattribut abhängt (Python)Python

Python-Programme
Guest
 Lru_cache für Klassenmethode, die von einem Klassenattribut abhängt (Python)

Post by Guest »

Ich habe eine Python-Klassenmethode Test.test(x), die teure Daten erzeugt, d. h. ich möchte functools.lru_cache als Wrapper verwenden. Die Ausgabe hängt jedoch von einem Klassenattribut Test.a ab, das eine kleine Anzahl unterschiedlicher Werte annehmen kann. Ich möchte für jede Kombination (a,x) des Attributs a und des Parameters x eine zwischengespeicherte Version behalten. D.h. Ich möchte, dass der Cache wie gewohnt funktioniert, solange das Attribut a unverändert bleibt, aber die Methode sollte neu ausgewertet werden, sobald sich das Klassenattribut ändert. Wie gelingt das am besten?
Hier das Codebeispiel:

Code: Select all

from functools import lru_cache

class Test():
a = 1

def __new__(cls, a = 1):
cls.a = a
return super().__new__(cls)

@classmethod
@lru_cache(maxsize=32)
def test(cls, x):
return x * cls.a

print(Test.test(1),Test(2).test(1),Test.test(1))
Gewünschte Ausgabe (mit deaktiviertem lru_cache): 1 2 2
Ausgabe mit lru_cache: 1 1 1
Einige Klarstellungen:
  • Das Attribut a wird nur selten geändert, daher spielt es keine Rolle, ob es vorhanden ist ist eine zwischengespeicherte Kopie für jede Kombination (a,x) oder ob der Cache zurückgesetzt wird, wenn sich der Wert von a ändert.
  • Die Testmethode muss kann auf diese Weise als Klassenmethode implementiert werden (da es von einer abstrakten Klasse erbt, die ich nicht ändern kann).
  • Andere Möglichkeiten, die zu übergeben Wert von a zur Methode sind zumindest unerwünscht. Test(a).test(x) wäre die korrekte Art und Weise, wie ähnliche Funktionen des Projekts aufgerufen werden.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post