У меня есть метод класса Python Test.test(x), который генерирует дорогостоящие данные, т. е. я хотел бы использовать functools.lru_cache в качестве оболочки. Однако выходные данные зависят от атрибута класса Test.a, который может принимать небольшое количество разных значений. Я хотел бы сохранить кешированную версию для каждой комбинации (a, x) атрибута a и параметра x. Т.е. Я хочу, чтобы кеш работал обычным образом, пока атрибут a не изменяется, но метод должен быть переоценен после изменения атрибута класса. Как этого лучше всего достичь?
Вот пример кода:
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))
Желаемый вывод (с отключенным lru_cache): 1 2 2
Вывод с lru_cache: 1 1 1
Некоторые пояснения:
Атрибут a меняется редко, поэтому не имеет особого значения, существует ли это кэшированная копия для каждой комбинации (a,x), или сбрасывается ли кэш при каждом изменении значения a.
Метод тестирования должен быть реализован таким образом как метод класса (поскольку он наследуется от абстрактного класса, который я не могу изменить).
Другие способы передачи значения a для метода по меньшей мере нежелательны. Test(a).test(x) будет правильным способом вызова аналогичных функций проекта.
У меня есть метод класса Python Test.test(x), который генерирует дорогостоящие данные, т. е. я хотел бы использовать functools.lru_cache в качестве оболочки. Однако выходные данные зависят от атрибута класса Test.a, который может принимать небольшое количество разных значений. Я хотел бы сохранить кешированную версию для каждой комбинации (a, x) атрибута a и параметра x. Т.е. Я хочу, чтобы кеш работал обычным образом, пока атрибут a не изменяется, но метод должен быть переоценен после изменения атрибута класса. Как этого лучше всего достичь? Вот пример кода: [code]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)) [/code] Желаемый вывод (с отключенным lru_cache): 1 2 2 Вывод с lru_cache: 1 1 1 Некоторые пояснения: [list] [*]Атрибут a меняется редко, поэтому не имеет особого значения, существует ли это кэшированная копия для каждой комбинации (a,x), или сбрасывается ли кэш при каждом изменении значения a.
[*]Метод тестирования должен быть реализован таким образом как метод класса (поскольку он наследуется от абстрактного класса, который я не могу изменить).
[*]Другие способы передачи значения a для метода по меньшей мере нежелательны. Test(a).test(x) будет правильным способом вызова аналогичных функций проекта.