Top.Mail.Ru
Ответы

Помогите с 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

По дате
По рейтингу
Аватар пользователя
Ученик
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
 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)

Аватар пользователя
Оракул
1234567891011121314151617181920212223242526272829303132
 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)