Доработка программы Дек

Всем привет! Учусь на курсах по Python, была поставлена задача реализовать структуру данных Дек. Все разлиновал, но ревьювер просит пофиксить некоторые моменты, а я не понимаю, как это реализовать. Подскажите, пожалуйста, если есть какие мысли.

Кратко цель задачи:

В первой строке записано количество команд n — целое число, не превосходящее 5000. 
Во второй строке записано число m — максимальный размер дека. Он не превосходит 1000. 
В следующих n строках записана одна из команд: 
push_back(value) – добавить элемент в конец дека. Если в деке уже находится максимальное число элементов, вывести «error».
push_front(value) – добавить элемент в начало дека. Если в деке уже находится максимальное число элементов, вывести «error».
pop_front() – вывести первый элемент дека и удалить его. Если дек был пуст, то вывести «error».
pop_back() – вывести последний элемент дека и удалить его. Если дек был пуст, то вывести «error».

В общем, если на ввод подается:

4
4
push_front 861
push_front -819
pop_back
pop_back

То правильный ответ:

861
-819

Саму программу я реализовал, вот ее код:

class Deque:
    def __init__(self, max_size):
        self.elements = [None] * max_size
        self.max_n = max_size
        self.front = max_size - 1
        self.back = 0
        self.size = 0

    def is_empty(self):
        return self.size == 0

    def push_front(self, value):
        if self.size == self.max_n:
            raise OverflowError('List is full')
        self.elements[self.front] = value
        self.front = (self.front - 1) % self.max_n
        self.size += 1

    def pop_front(self):
        if self.is_empty():
            raise IndexError('List is empty')
        self.front = (self.front + 1) % self.max_n
        value = self.elements[self.front]
        self.size -= 1
        return value

    def push_back(self, value):
        if self.size == self.max_n:
            raise OverflowError('List is full')
        self.elements[self.back] = value
        self.back = (self.back + 1) % self.max_n
        self.size += 1

    def pop_back(self):
        if self.is_empty():
            raise IndexError('List is empty')
        self.back = (self.back - 1) % self.max_n
        value = self.elements[self.back]
        self.size -= 1
        return value


def deque(double_queue, command_list):
    results = []
    for command in command_list:
        command_values, *command_parameters = command.split()
        try:
            operation = getattr(double_queue, command_values)
            if command_parameters is []:
                results.append(operation(*command_parameters))
            else:
                operation(*command_parameters)
        except (IndexError, OverflowError):
            results.append('error')

        **# ошибка тут**
        except AttributeError:
            raise AttributeError(f'Command {command_values} is not exists')
        **# ошибка тут**
        for result in results:
            print(result)


if __name__ == '__main__':
    total_commands = int(input())
    double_queue = Deque(max_size=int(input()))
    command_list = [input() for field in range(total_commands)]
    deque(double_queue, command_list)

Первая ошибка в строках:

except AttributeError:
    raise AttributeError(f'Command {command_values} is not exists')

Неудачный тип для броска. Тут проблема со значением очередной команды

Вторая ошибка:

for result in results:
    print(result)

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

Я, честно говоря, не понимаю чем AttributeError не подходит, тк он ловит ошибку, если подана неверная команда А по выдаче результата print(result), я не понимаю, как правильно вывести результат без цикла и принта. Если делать просто return, то он выводит только 1 ответ.

UPD. Вроде с выводом решил, но как-то криво

if __name__ == '__main__':
    total_commands = int(input())
    double_queue = Deque(max_size=int(input()))
    command_list = [input() for field in range(total_commands)]
    results = deque(double_queue, command_list)
    for result in results:
        print(result)

UPD2. По второму вопросу, хз, правильно ли, но запихал operation(*command_parameters) в int и сделал проверку на ValueError. Это ли имелось ввиду - не знаю, отпишу после ревью)

UPD3. В общем, я так понял, что еще TypeError надо перехватывать)

except TypeError:
    raise TypeError('getattr(): attribute name must be string')

UPD4. По второму вопросу ревьювер хотел следующее:

except AttributeError:
    raise ValueError(f'Command {command_name} is not exists')

Я что-то не очень понял в чем смысл, если кто сможет объяснить, сообщите, пожалуйста)


Ответы (0 шт):