Помогите с python
Задача 4. Кэширование запросов
Задача
Создайте класс LRU Cache, который хранит ограниченное количество объектов и, при превышении лимита, удаляет самые давние (самые старые) использованные элементы.
Реализуйте методы добавления и извлечения элементов с использованием декораторов property и setter.
@property
def cache(self): # этот метод должен возвращать самый старый элемент
...
@cache.setter
def cache(self, new_elem): # этот метод должен добавлять новый элемент
...
Ожидаемый вывод в консоли:
LRU Cache:
key1 : value1
key2 : value2
key3 : value3
value2
LRU Cache:
key3 : value3
key2 : value2
key4 : value4
from collections import OrderedDict
from typing import Union
class LRUCache:
""" Класс хранит ограниченное количество объектов и если лимит превышен,
удаляются самые старые использованные элементы. """
def __init__(self, capacity: int) -> None:
""" Конструктор для инициализации атрибутов класса.
Args:
capacity (int): Максимальное количество объектов, которые можно хранить в кэше.
"""
self.__capacity = capacity
self.__cache_dict = OrderedDict()
@property
def cache(self) -> Union[tuple, str]:
""" Возвращает последнюю пару ключ-значение из словаря __cache_dict.
Если словарь пуст, возвращает строку 'Элементов в кэше нет'.
Returns:
Последняя пара ключ-значение из словаря __cache_dict, если словарь не пуст.
Если словарь пуст, возвращает строку 'Элементов в кэше нет'.
"""
return next(iter(self.__cache_dict.items())) if self.__cache_dict else 'Элементов в кэше нет'
@cache.setter
def cache(self, new_elem: tuple) -> None:
""" Добавляет в кэш новый элемент, предварительно производит проверку на переполнение. """
if len(self.__cache_dict) >= self.__capacity:
self.__cache_dict.popitem(last=False)
self.__cache_dict[new_elem[0]] = new_elem[1]
def print_cache(self) -> None:
""" Выводит текущий кэш. """
print('LRU Cache:')
if self.__cache_dict:
for key, value in self.__cache_dict.items():
print(f'{key} : {value}')
else:
print('Элементов в кэше нет')
def get(self, key: str) -> str:
""" Возвращает значение искомого ключа в словаре.
Returns:
Значение ключа из словаря __cache_dict если такое имеется.
Если такого ключа нет, возвращает строку 'Такого значения не существует'.
"""
if key in self.__cache_dict:
self.__cache_dict.move_to_end(key)
return self.__cache_dict.get(key)
else:
return 'Такого значения не существует'
cache = LRUCache(3)
cache.cache = ('key1', 'value1')
cache.cache = ('key2', 'value2')
cache.cache = ('key3', 'value3')
cache.print_cache()
print(cache.get('key2'))
cache.cache = ('key4', 'value4')
cache.print_cache()
class LRUCache:
def __init__(self, capacity):
self.capacity = capacity
self.cache_dict = {}
@property
def cache(self):
if len(self.cache_dict) > 0:
oldest_key = next(iter(self.cache_dict))
return f"{oldest_key} : {self.cache_dict[oldest_key]}"
return "LRU Cache is empty."
@cache.setter
def cache(self, new_elem):
if len(self.cache_dict) >= self.capacity:
oldest_key = next(iter(self.cache_dict))
del self.cache_dict[oldest_key]
self.cache_dict[new_elem[0]] = new_elem[1]
# Пример использования класса LRU Cache
cache = LRUCache(3)
cache.cache = ('key1', 'value1')
cache.cache = ('key2', 'value2')
cache.cache = ('key3', 'value3')
print("LRU Cache:")
print(cache.cache)
print(cache.cache_dict['key2']) # Извлекаем элемент по ключу для проверки
cache.cache = ('key4', 'value4')
print("LRU Cache:")
print(cache.cache)
from collections import OrderedDict
class LRUCache:
def __init__(self, capacity: int):
self.cache = OrderedDict()
self.capacity = capacity
@property
def cache(self):
return next(iter(self.cache.values()))
@cache.setter
def cache(self, key_value):
key, value = key_value
if key in self.cache:
self.cache.move_to_end(key)
self.cache[key] = value
if len(self.cache) > self.capacity:
self.cache.popitem(last=False)
def __repr__(self):
return f'LRU Cache:\n' + '\n'.join([f'{k} : {v}' for k, v in self.cache.items()])
cache = LRUCache(3)
cache.cache = ('key1', 'value1')
cache.cache = ('key2', 'value2')
cache.cache = ('key3', 'value3')
print(cache)
print(cache.cache)
cache.cache = ('key4', 'value4')
print(cache)