Mam nadzieję, że u ciebie wszystko w porządku!

Używam funkcji, która wykorzystuje bibliotekę Lru_Cache of Functools. na przykład:

@functools.lru_cache(maxsize=pow(2,13))
def get_id(word):
    # retrieving id, using cache if possible

Chciałbym w niektórych okazjach, aby ominąć pamięć podręczną, dzięki czemu identyfikator prosto ze źródła, ale nie chciałbym utworzyć 2 oddzielnych funkcji (jeden z pamięci podręcznej, a drugi bez), które prowadzą dokładnie ten sam kod. Czytanie dokumentacji funkcji na Docs.Python Rozumiem, że pamięć podręczna może być pomijana:

Oryginalna funkcja bazowa jest dostępna przez owinięty atrybut. Jest to przydatne do introspekcji, do obejścia pamięci podręcznej, lub do przepisania funkcji z inną pamięcią podręczną.

Próbowałem robić tak z funkcją opakowania, ale ponieważ funkcja wewnętrzna istnieje tylko podczas gdy funkcja zewnętrzna była uruchomiona, pamięć podręczna została zresetowana na każdym połączeniu.

Byłbym wdzięczny za pomoc w tej sprawie.

1
Joshua 23 październik 2020, 14:23

1 odpowiedź

Najlepsza odpowiedź

Dokumentacja mówi, że możesz uzyskać dostęp do owiniętej funkcji bezpośrednio w ten sposób (omijając buforowanie):

get_id.__wrapped__(word="hello")

Możesz dodać jedną dodatkową warstwę z flagą:

from functools import lru_cache

@lru_cache(maxsize=pow(2, 13))
def get_cached(word):
    return get_raw(word)

def get_raw(word):
    # your logic goes here...
    pass

def get_id(word, cached=True):
    if cached:
        return get_cached(word)
    else:
        return get_raw(word)
1
hiro protagonist 23 październik 2020, 13:41