Используйте klepto для кэширования по имени функции и аргументам
Я пытаюсь использовать klepto в качестве кэша, который хэширует аргументы и имя функции, это возможно?
например, так с помощью dir_cache я смог бы
@inf_cache(cache=dir_archive(cached=False))
def func1(x, y):
return x + y
@inf_cache(cache=dir_archive(cached=False))
def func2(x, y):
return x - y
и оба вызова func1(1, 2) и func2(1, 2) приведут к отдельным ключам в dir_archive
я что-то пропустил?
1 ответ
Решение
Хотя, возможно, это не совсем надежное решение, на некотором уровне это, кажется, делает то, что вы хотите.
>>> import klepto
>>> @klepto.inf_cache(cache=klepto.archives.dir_archive(cached=False))
... def func1(x, y, name='func1'):
... return x+y
...
>>> @klepto.inf_cache(cache=klepto.archives.dir_archive(cached=False))
... def func2(x, y, name='func2'):
... return x-y
...
>>>
>>> func1(1,2)
3
>>> func1(1,3)
4
>>> func2(2,4)
-2
>>> func2(1,2)
-1
>>> func1.__cache__()
dir_archive('memo', {-8532897055064740991: 4, -8532897055063328358: 3, -960590732667544693: -1, -3289964007849195004: -2}, cached=False)
>>>
>>> func1(1,2)
3
>>> func1(1,2)
3
>>> func2(1,2)
-1
>>>
>>> func1.__cache__() == func2.__cache__()
True
Вы заметите, что dir_archive
то же самое, и функции, кажется, используют отдельные кэши. Одним из вопросов было бы то, что вы могли бы передать в 'name'
переопределить настройки по умолчанию и легко все испортить. Я предполагаю, что вы могли бы сделать что-то более надежное, если это необходимо, с другим декоратором, чтобы пользователь не мог изменить 'name'
ключевое слово.