отключить `functools.lru_cache` изнутри функции - PullRequest
1 голос
/ 11 июня 2019

Я хочу иметь функцию, которая может использовать functools.lru_cache, но не по умолчанию.Я ищу способ использовать параметр функции, который можно использовать для отключения lru_cache.В настоящее время у меня есть две версии функции, одна с lru_cache и одна без.Затем у меня есть другая функция, которая оборачивает их параметром, который можно использовать для управления тем, какая функция используется

def _no_cache(foo):
    print('_no_cache')
    return 1


@lru_cache()
def _with_cache(foo):
    print('_with_cache')
    return 0


def cache(foo, use_cache=False):
    if use_cache:
        return _with_cache(foo)
    return _no_cache(foo)

Есть ли более простой способ сделать это?

Ответы [ 2 ]

1 голос
/ 11 июня 2019

Вы не можете отключить кеш внутри декорированной функции.Тем не менее, вы можете немного упростить свой код, обратившись к функции напрямую через атрибут __wrapped__.

Из документации :

Исходная базовая функциядоступен через атрибут __wrapped__.Это полезно для самоанализа, обхода кеша или перемотки функции с другим кешем.

Демонстрация:

from functools import lru_cache

@lru_cache()
def f(arg):
    print(f"called with {arg}")
    return arg    

def call(arg, use_cache=False):
    if use_cache:
        return f(arg)
    return f.__wrapped__(arg)

call(1)
call(1, True)
call(2, True)
call(1, True)

Вывод:

called with 1
called with 1
called with 2
0 голосов
/ 11 июня 2019

Для проверки вы можете использовать cache_info() метод упакованной функции:

from functools import lru_cache

@lru_cache()
def my_function(foo):
    return foo * 2

def cache(foo, use_cache=False):
    if use_cache is False:
        return my_function.__wrapped__(foo)
    return my_function(foo)

print(cache(10, use_cache=True))    # cache miss
print(cache(10, use_cache=True))    # cache hit
print(cache(10, use_cache=False))   # bypass
print(cache(20, use_cache=False))   # bypass

print(my_function.cache_info())     # cache size=1, hit=1, miss=1

Печать:

20
20
20
40
CacheInfo(hits=1, misses=1, maxsize=128, currsize=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...