Декоратор кеширования результатов функции

swarmone

Новичок
Пользователь
Мар 10, 2021
10
0
1
Помогите пожалуйста создать такой декоратор, буду очень благодарна Вам.

Нужно создать декоратор для функции, которая принимает неограниченное количество позиционных ХЕШИРУЕМЫХ элементов.

Декоратор добавляет следующий функционал:
Если функция уже вызвалась с такими аргументами - ваша функция должна вернуть результат выполнения этой функции из памяти, а не вычислять его заново.
Если не вызывалась - вычислить результат, положить его в память, и вернуть.

Подсказка - тут вам пригодятся словари.
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
В идеале конечно хотелось бы видеть решение, чтобы разобраться как это пишется
Вот пример:
Python:
# декоратор для кеширования
def cache_decorator(func, *args):
    cache = {}

    def decorated_function(*args):
        print('-' * 50)
        print('args =', args)
        print('cache =', cache)
        if cache.get(args):
            print('Operation: get the result from the cache')
            return cache[args]
        else:
            print('Operation: calculating and caching the result')
            cache[args] = func(*args)
            return cache[args]
    return decorated_function


# пример использования
@cache_decorator
def custom_sum(*args):
    return sum(args)


# результат
print('result =', custom_sum(1, 2))
print('result =', custom_sum(1, 2))
print('result =', custom_sum(1, 2, 3))
print('result =', custom_sum(1, 2, 3))
 
  • Мне нравится
Реакции: swarmone

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 569
456
83
ну вам уже подсказали...
чем помочь то?
 

swarmone

Новичок
Пользователь
Мар 10, 2021
10
0
1
ну вам уже подсказали...
чем помочь то?
Если бы мне эта подсказка чем-то помогла, я бы не обращалась )
Я только прохожу декораторы, сложная тема. В идеале конечно хотелось бы видеть решение, чтобы разобраться как это пишется
 

swarmone

Новичок
Пользователь
Мар 10, 2021
10
0
1
Вот пример:
Python:
# декоратор для кеширования
def cache_decorator(func, *args):
    cache = {}

    def decorated_function(*args):
        print('-' * 50)
        print('args =', args)
        print('cache =', cache)
        if cache.get(args):
            print('Operation: get the result from the cache')
            return cache[args]
        else:
            print('Operation: calculating and caching the result')
            cache[args] = func(*args)
            return cache[args]
    return decorated_function


# пример использования
@cache_decorator
def custom_sum(*args):
    return sum(args)


# результат
print('result =', custom_sum(1, 2))
print('result =', custom_sum(1, 2))
print('result =', custom_sum(1, 2, 3))
print('result =', custom_sum(1, 2, 3))
Спасибо!
 

Форум IT Специалистов