Найти - Пользователи
Полная версия: Задача с декораторами метода
Начало » Центр помощи » Задача с декораторами метода
1
A13x4nder
Нужно написать декоратор для двухуровневого кэширования результатов выполнения методов. Таким образом, при повторном вызове метода с теми же параметрами метод не должен выполняться, а результат должен возвращаться декоратором из кэша. Первый уровень кэша - в памяти, второй - в sqlite. Реализовать возможность параметром декоратора задавать максимальный размер кэша (число кэшированных результатов) в памяти.

@cache(max_memory=1000)
def func(arg1, arg2):
    return arg1+arg2

Сейчас я застопорился на том, как передать аргументы (этот самый max_memory) декоратору. Подскажите пример кода.
И, вообще, буду очень благодарен за мысли по решению задачи.
Shaman
Уровень вопросов не соответствует уровню пролемы.
Работа с дерокаторами разжевана здесь неоднократно. На всяий случай нужно узнать как кэширует sqlite, если она вообще этим занимается, дальше pickle.
A13x4nder
Shaman
Уровень вопросов не соответствует уровню пролемы.Работа с дерокаторами разжевана здесь неоднократно. На всяий случай нужно узнать как кэширует sqlite, если она вообще этим занимается, дальше pickle.
Насчет декораторов мне конкретный частный случай не ясен. Когда нужно передать атрибут декоратору функции - понятно, методу - никак не выходит. Вот и спрашиваю, есть ли у кого пример кода.
Про pickle спасибо! А то я неверно понял задачу. Решил, что имеется в виду память оперативная и сохранение в переменной.
FishHook
def increment(i):
    def decorator(func):
        def wrapper(*args, **kw):
            return func(*args, **kw) + i
        return wrapper
    return decorator
@increment(10)
def foo(x):
    return x ** 2
print (foo (8))
py.user.next
>>> class A:
...     def dd(m=None):
...         def d(f):
...             def g(*args):
...                 print(m)
...                 return f(*args)
...             return g
...         return d
...     
...     @dd(10)
...     def f1(self, arg1, arg2):
...         return arg1 + arg2
...     
...     @dd(20)
...     def f2(self, arg1, arg2):
...         return arg1 * arg2
... 
>>> a = A()
>>> a.f1(1, 2)
10
3
>>> a.f2(3, 4)
20
12
>>>
A13x4nder
FishHook, спасибо!!! Буду двигаться дальше!!!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB