Estoy revisando los detalles de implementación del decorador de caché LRU de Python. Para comprender correctamente el comportamiento del decorador lru_cache en diferentes escenarios, también revisé las siguientes respuestas SO:
Hasta ahora, puedo decir que los comportamientos de almacenamiento en caché son diferentes en estos 3 escenarios:
classmethod staticmethod o de método de clase. El primer caso es el camino feliz donde cada función decorada con el decorador lru_cache tiene su propio caché. Esto ya está bien documentado . En el segundo caso, el caché se comparte entre múltiples instancias de la clase donde cada instancia tendrá diferentes claves para el mismo argumento del método de instancia. Esto se explica bastante bien en la última pregunta que he enumerado. En el tercer caso, la caché también se comparte entre varias instancias de la clase encapsuladora. Sin embargo, dado que el método estático o el método de clase no self toman como primer argumento, las instancias de la clase no crearán entradas de caché separadas para los mismos argumentos.
Mi pregunta es: ¿qué detalle de implementación define este comportamiento? En la implementación de la función lru_cache , solo puedo ver que un diccionario de caché local dentro de la función _lru_cache_wrapper está guardando las entradas de caché. Aquí está el fragmento:
def _lru_cache_wrapper(user_function, maxsize, typed, _CacheInfo): sentinel = object() make_key = _make_key PREV, NEXT, KEY, RESULT = 0, 1, 2, 3 cache = {} # This is a local dict, # then how come the instance cache entries are shared? Lo que no entiendo es cómo se comparte este diccionario de caché local entre las instancias de una clase cuando el decorador lru_cache se aplica a un método que reside en la clase. Esperaba que actuara igual que el primer caso en el que cada entidad tiene su propio caché y no se comparte nada.