Используйте 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' ключевое слово.

Другие вопросы по тегам