Аккаунт на github.com успешно привязан к вашему аккаунту. Теперь можно отправить задание на проверку.

Калькулятор денег и калорий

Вы добрались до итогового проекта спринта. Когда вы выполните это задание — в вашем распоряжении окажутся два отличных инструмента для контроля расходов и доходов.
Перед тем, как приступить к заданию — технические подробности.

Менеджер пакетов pip

Вы уже устанавливали программы через пакетный менеджер Chocolatey или brew. Существуют и специализированные менеджеры пакетов.
Вместе с Python на ваш компьютер был установлен пакетный менеджер pip, он поможет вам управлять модулями, библиотеками и фреймворками в среде Python. Большая часть питоньих пакетов выложена в публичный доступ на сайте https://pypi.org/ (Python Package Index), именно туда будет по умолчанию обращаться pip по команде
Скопировать кодBASH
$ pip install chto-nibud'
Если требуется установить строго определённую версию пакета — просто укажите её:
Скопировать кодBASH
$ pip install django==2.02
Если по какой-то причине команды для pip не срабатывают, попробуйте обращаться не к pip, а к pip3:
Скопировать кодBASH
$ pip3 install chto-nibud'
Для Python написаны и другие менеджеры пакетов, но пока еще ни один не стал более популярен, чем pip.

Порядок работы над заданием

  1. Сейчас необходимо привязать свой аккаунт GitHub к аккаунту Яндекс-Практикума.
  2. После связывания аккаунтов на вашем GitHub автоматически появится новый приватный репозиторий hw_python_oop.
  3. Склонируйте этот репозиторий на свой компьютер. Сейчас в репозитории hw_python_oop лежит пустая заготовка кода и набор автоматических тестов.
  4. Установите программу автоматического тестирования кода pytest. Перед тем, как сдавать решение на проверку, убедитесь, что автоматические тесты проходят успешно. Как как установить pytest и запустить тесты — прочитайте здесь.
  5. Когда все тесты пройдены — запушьте ваш код (выполните git push) в ваш репозиторий hw_python_oop. После этого нажмите кнопку «Отправить на проверку».
Будьте внимательны: файлы и папки вашего проекта должны быть размещены в головной папке репозитория, который вы скачали.
image
Если проект не удается отправить обычным способом и платформа предлагает загрузить проект архивом, соблюдайте два правила:
  • Ваш архив с проектом должен быть именно в формате ZIP. Формат архива принципиально важен.
  • Размер архива не должен быть больше 4 MB
  1. Автоматические тесты будут ещё раз запущены на платформе, и если ваше решение их проходит, оно отправится на code review, его проверят специалисты.
В случае затруднений вернитесь к уроку «Знакомство с Git».
Условие задачи
Создайте два калькулятора: для подсчёта денег и калорий. Пользовательскую часть калькуляторов, их «лицо», писать не нужно, напишите только логику — отдельный класс для каждого из калькуляторов.
Калькулятор денег должен уметь:
  1. Сохранять новую запись о расходах методом add_record()
  2. Считать, сколько денег потрачено сегодня методом get_today_stats()
  3. Определять, сколько ещё денег можно потратить сегодня в рублях, долларах или евро — метод get_today_cash_remained(currency)
  4. Считать, сколько денег потрачено за последние 7 дней — метод get_week_stats()
Калькулятор калорий должен уметь:
  1. Сохранять новую запись о приёме пищи— метод add_record()
  2. Считать, сколько калорий уже съедено сегодня — метод get_today_stats()
  3. Определять, сколько ещё калорий можно/нужно получить сегодня — метод get_calories_remained()
  4. Считать, сколько калорий получено за последние 7 дней — метод get_week_stats()
У калькуляторов много пересекающихся функций: они должны уметь хранить какие-то записи (о еде или деньгах, но по сути - всё числа и даты), знать дневной лимит (сколько в день можно истратить денег или сколько калорий можно получить) и суммировать записи за конкретные даты. Всю эту общую функциональность заложите в родительский класс Calculator, а от него унаследуйте классы CaloriesCalculator и CashCalculator.
Конструктор класса Calculator должен принимать один аргумент --- число limit (дневной лимит трат/калорий, который задал пользователь). В конструкторе создайте пустой список, в котором потом будут храниться записи (назовите его records).
Чтобы было удобнее создавать записи, создайте для них отдельный класс Record. В нём сохраните:
  • число amount (денежная сумма или количество килокалорий),
  • дату создания записи date (передаётся в явном виде в конструктор, либо присваивается значение по умолчанию — текущая дата),
  • комментарий comment, поясняющий, на что потрачены деньги или откуда взялись калории.
Примеры таких записей:
Скопировать кодPYTHON
# для CashCalculator r1 = Record(amount=145, comment="Безудержный шопинг", date="08.03.2019") r2 = Record(amount=1568, comment="Наполнение потребительской корзины", date="09.03.2019") r3 = Record(amount=691, comment="Катание на такси", date="08.03.2019") # для CaloriesCalculator r4 = Record(amount=1186, comment="Кусок тортика. И ещё один.", date="24.02.2019") r5 = Record(amount=84, comment="Йогурт.", date="23.02.2019") r6 = Record(amount=1140, comment="Баночка чипсов.", date="24.02.2019")

Подробнее о формате вывода

1. Метод get_calories_remained() калькулятора калорий должен возвращать ответ
  • «Сегодня можно съесть что-нибудь ещё, но с общей калорийностью не более N кКал», если лимит limit не достигнут,
  • или «Хватит есть!», если лимит достигнут или превышен.
2. Метод get_today_cash_remained(currency) денежного калькулятора должен принимать на вход код валюты: одну из строк "rub", "usd" или "eur".
Возвращает он сообщение о состоянии дневного баланса в этой валюте, округляя сумму до двух знаков после запятой (до сотых):
  • «На сегодня осталось N руб/USD/Euro» — в случае, если лимит limit не достигнут,
  • или «Денег нет, держись», если лимит достигнут,
  • или «Денег нет, держись: твой долг - N руб/USD/Euro», если лимит превышен.
Курс валют укажите константами USD_RATE и EURO_RATE, прямо в теле класса CashCalculator. Какой курс вы укажете — не так важно, выберите любой, похожий на правду. Значения обменного курса можно посмотреть, например, на главной странице Яндекса https://yandex.ru. Получать актуальный курс с биржи мы обязательно научимся, только чуть позже.

Рекомендации и подсказки

  1. Как добавлять новую запись
Метод add_record() в качестве аргумента принимает объект класса Record и сохраняет его в списке records.
  1. Как работать со временем и датой
Вам понадобится функция для преобразования дат из строк в формат datetime.date и функция dt.datetime.now(), которая возвращает текущую дату.
Есть повод повторить урок про datetime из бесплатного курса по Python :)
Скопировать кодPYTHON
import datetime as dt date_format = '%d.%m.%Y' moment = dt.datetime.strptime('16.12.2019', date_format) print(moment) # напечатает что-то вроде 2019-12-16 00:00:00 day = moment.date() print(day) # напечатает дату: 2019-12-16 now = dt.datetime.now() print(now) # напечатает время на текущий момент в формате: 2019-01-31 13:33:27.506227 print(now.date()) # напечатает текущую дату: 2019-01-31
  1. Как проверить, что всё работает
Чтобы своими глазами увидеть, что ваши классы работают правильно, напишите какой-нибудь сценарий их использования.
Например:
Скопировать кодPYTHON
import datetime as dt class Record: ... class Calculator: ... # создадим калькулятор денег с дневным лимитом 1000 cash_calculator = CashCalculator(1000) # дата в параметрах не указана, # так что по умолчанию к записи должна автоматически добавиться сегодняшняя дата cash_calculator.add_record(Record(amount=145, comment="кофе")) # и к этой записи тоже дата должна добавиться автоматически cash_calculator.add_record(Record(amount=300, comment="Серёге за обед")) # а тут пользователь указал дату, сохраняем её cash_calculator.add_record(Record(amount=3000, comment="бар в Танин др", date="08.11.2019")) print(cash_calculator.get_today_cash_remained("rub")) # должно напечататься # На сегодня осталось 555 руб