Что происходит при повторном вводе данных и пересчете суммы в калькуляторе
Что проверяют
Думаете ли вы про состояние. Вопрос звучит бытово, а проверяют, видите ли вы разницу между «накопить» и «пересчитать заново» и что делает ваш код, когда пользователь исправляет введённое значение или повторяет ввод после ошибки.
Как отвечать
Сначала уточните постановку: повторный ввод заменяет прежнее значение или добавляется к нему. Это не придирка, от ответа зависит, где живёт состояние.
Надёжная схема: хранить не итог, а введённые значения, а сумму считать функцией от них. Тогда правка это замена элемента и честный пересчёт, отмена делается бесплатно, а расхождение итога с тем, что видно на экране, становится невозможным.
class Calc:
def __init__(self):
self.items = []
def set_item(self, index, raw):
self.items[index] = parse_amount(raw)
@property
def total(self):
return sum(self.items, Decimal(0))Разбор ввода выносите в отдельную функцию: она убирает пробелы, принимает запятую как разделитель, отвергает пустую строку и возвращает Decimal, а не float. Ошибку поднимайте исключением, а не печатью в консоль: печать внутри модели лишает вызывающий код возможности среагировать, а тесты вынуждает ловить вывод.
Где спотыкаются
Копят результат в одной переменной. При правке приходится вычитать старое значение, любая пропущенная ветка даёт итог, который не сходится ни с чем, и ошибка накапливается тихо.
Второе: считают деньги в float. Сумма 0.1 и 0.2 не равна 0.3, после десятка операций итог расходится с ожидаемым в последних знаках, а сравнение на равенство в тестах начинает мигать. Для денег берут Decimal и округляют один раз, при выводе.
Третье: слишком доверчивый разбор. float("nan") и float("inf") проходят без исключения и отравляют итог навсегда, потому что сумма с nan тоже nan. float(True) даст единицу, а пустая строка бросит ValueError там, где ожидали ноль. Проверять нужно явно и до записи в состояние.