Программа, которой можно пользоваться каждый день, а не учебный пример
argparse с подкомандами и справкойНужна программа budget для учёта личных расходов. Каждая трата — запись: дата, сумма, категория, комментарий. Программа добавляет и удаляет записи, показывает список за месяц, строит отчёт по категориям и выгружает данные в таблицу. Данные хранятся в файле budget.json и не теряются между запусками. Так выглядит работа с эталонным решением (Debian 13, Python 3.13):
$ python3 budget.py -h
usage: budget [-h] [-f FILE] КОМАНДА ...
Учёт расходов.
positional arguments:
КОМАНДА
add добавить расход
list список расходов
report отчёт по категориям
delete удалить запись по номеру
export выгрузить в CSV для Excel
options:
-h, --help show this help message and exit
-f, --file FILE файл данных (по умолчанию budget.json)
$ python3 budget.py add 4250,80 Продукты -c "Лента, неделя" -d 2026-10-01
Добавлено: №1, 2026-10-01, 4 250,80 руб., продукты
$ python3 budget.py add 1990 связь -c "мобильный и интернет" -d 01.10.2026
Добавлено: №2, 2026-10-01, 1 990,00 руб., связь
…
$ python3 budget.py list -m 2026-10
№ Дата Сумма, руб. Категория Комментарий
1 2026-10-01 4 250,80 продукты Лента, неделя
2 2026-10-01 1 990,00 связь мобильный и интернет
3 2026-10-03 650,00 транспорт Подорожник
5 2026-10-05 12 500,00 аренда доля за октябрь
4 2026-10-08 2 899,90 продукты
7 2026-10-15 320,00 кафе
Итого: 22 610,70 руб., записей: 6
$ python3 budget.py report -m 2026-10
Расходы за 2026-10
аренда 12 500,00 55% █████████████████
продукты 7 150,70 32% █████████
связь 1 990,00 9% ███
транспорт 650,00 3% █
кафе 320,00 1%
итого 22 610,70
Ошибки ввода не роняют программу и не портят данные:
$ python3 budget.py add сто кафе
budget: ошибка: сумма должна быть числом: 'сто'
$ python3 budget.py add 500 кафе -d 31.02.2026
budget: ошибка: нет такой даты или формат не ГГГГ-ММ-ДД / ДД.ММ.ГГГГ: 31.02.2026
$ python3 budget.py delete 7
Удалено: №7, 2026-10-15, 320,00 руб., кафе
$ python3 budget.py delete 7
budget: ошибка: нет записи №7
$ python3 budget.py export october.csv -m 2026-10
Выгружено записей: 5 -> october.csv
Формат вывода, имена команд и текст сообщений можно выбрать свои. Обязательны возможности и поведение из раздела 02.
| Требование | Модуль |
|---|---|
Команды: добавить, список, отчёт, удалить, выгрузить; справка -h у программы и у каждой команды | 08 |
Никаких input: всё через аргументы, чтобы программу можно было вызывать из скриптов | 08 |
Сумма с точкой или запятой, без погрешности float: хранение в копейках (int) или Decimal | 02 |
| Дата в двух форматах, проверка существования даты; без даты — сегодня | 04, 06 |
| Отбор за месяц, группировка по категориям, доля каждой, сортировка по убыванию | 05 |
Хранение в JSON с ensure_ascii=False; первый запуск без файла работает | 07 |
| Неверный ввод и повреждённый файл — сообщение в stderr и ненулевой код возврата, без traceback | 07 |
| Выгрузка в CSV, которая открывается в русском Excel без «кракозябр» | 07 |
| Код в двух модулях: хранение отдельно от команд; функции с docstring | 06 |
Проверки на assert для разбора суммы и даты | 06 |
parse_amount("99,90") → 9990 копеек, parse_date("05.10.2026") → "2026-10-05". Сразу — проверки на assert с правильными и неправильными значениями.load и save. Проверьте первый запуск без файла и файл, оборванный на середине.add и list — уже можно пользоваться. Потом report, delete, export.echo $?.argparse создаются через parser.add_subparsers(): у каждой свой набор аргументов, как у git commit и git log. Пример — в документации модуля, раздел «Sub-commands». Чтобы запись файла не оборвалась на середине, пишите во временный файл и заменяйте основной через os.replace.Подробные требования, что сдаётся и критерии оценивания — в задании на портале.
Вы прошли курс «Основы Python». Дальше — курсы «Основы SQL» (хранить данные в базе вместо JSON), «Основы тестирования ПО» (автотесты на Python) и «Основы Git» (вести проект в репозитории).