Доработка программы Дек
Всем привет! Учусь на курсах по 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')
Я что-то не очень понял в чем смысл, если кто сможет объяснить, сообщите, пожалуйста)