Отладка, тестирование и основы стиля кода
Вы уже умеете писать программы на Python: использовать условия и циклы, работать с коллекциями, создавать функции, обрабатывать исключения, читать и записывать файлы, разбивать код на модули и пакеты. Следующий шаг к более надёжным и поддерживаемым программам — научиться:
находить и исправлять ошибки с помощью отладки;
проверять корректность кода через тестирование;
писать код в понятном стиле, чтобы его было легче читать и менять.!Цикл разработки: от ошибки до исправления и проверки
Отладка: как искать ошибки в программе
Отладка — это процесс поиска причины, по которой программа:
падает с ошибкой;
работает, но выдаёт неправильный результат;
зависает или выполняется слишком долго.Типы проблем: синтаксис и выполнение
Синтаксическая ошибка возникает, когда Python не может прочитать код.
Ошибка выполнения возникает, когда код читается нормально, но ломается при запуске (например, деление на ноль, неправильный тип данных).Пример синтаксической ошибки:
Пример ошибки выполнения:
Traceback: главное, что нужно уметь читать
Когда возникает исключение и оно не обработано, Python печатает traceback — список вызовов, который показывает:
в каком файле произошла ошибка;
на какой строке;
через какие функции программа пришла к этой строке;
тип исключения и сообщение.Пример:
При запуске вы увидите ValueError. В traceback важно смотреть:
на последнюю строку (тип исключения и сообщение);
на самую нижнюю строку вашего кода в стеке вызовов (обычно там ошибка проявилась);
на строки выше, чтобы понять, откуда пришли данные.Документация про встроенные исключения: Built-in Exceptions
Мини-алгоритм поиска ошибки
Воспроизведите ошибку стабильно (одни и те же действия дают одну и ту же проблему).
Упростите пример: уберите всё лишнее, оставьте минимальный код, где проблема остаётся.
Прочитайте traceback и найдите строку, где ошибка возникла.
Проверьте входные данные на этой строке: типы, значения, пустые строки, None.
Исправьте и снова воспроизведите.Отладка через print()
Самый простой инструмент — временно распечатать значения.
Так быстро видно, что в список попала строка, и сложение ломается.
Практические советы:
Печатайте и значение, и тип через type().
Печатайте ключевые точки: вход в функцию, результат вычисления, значения в цикле.
Удаляйте отладочные print() после исправления (иначе они превращаются в шум).Встроенный отладчик pdb и breakpoint()
Когда одних print() недостаточно, удобно остановить программу в нужном месте и пошагово выполнять код.
В Python есть встроенный отладчик pdb. Самый простой способ поставить точку остановки — вызвать breakpoint().
После остановки доступны базовые команды:
l показать код вокруг текущей строки
p имя вывести значение (например, p data)
n выполнить текущую строку и перейти к следующей
s зайти внутрь вызываемой функции
c продолжить выполнение до следующей остановки
q выйти из отладчикаДокументация: pdb — The Python Debugger
Отладка в редакторе (IDE)
Если вы используете Visual Studio Code или PyCharm, у них есть графический отладчик:
ставите breakpoint кликом слева от строки;
запускаете в режиме Debug;
смотрите значения переменных, стек вызовов, выполняете шаги.Это удобнее pdb, но полезно уметь оба подхода.
Тестирование: как проверять код автоматически
Тестирование — это запуск кода так, чтобы проверить: для известных входных данных получаются ожидаемые результаты.
Зачем тесты нужны даже в маленьких проектах:
вы быстрее ловите ошибки после изменений;
проще переписывать код, не боясь сломать старое;
тесты служат документацией на поведение функций.!Пирамида показывает, что чаще всего делают много маленьких unit-тестов
Что удобнее всего тестировать
Лучше всего тестируются функции, которые:
получают данные через параметры;
возвращают результат через return;
не зависят от input(), файлов и глобальных переменных.Если функция читает файл или спрашивает ввод, её можно разделить:
одна часть читает данные;
другая обрабатывает данные (и именно её удобно тестировать).assert: базовая проверка ожидания
assert проверяет условие. Если оно ложно, возникает AssertionError.
Важно:
assert полезен в учебных примерах и простых проверках.
полноценные тесты обычно пишут в тестовом фреймворке, чтобы видеть отчёт по многим проверкам.unittest: стандартный фреймворк тестирования
В стандартной библиотеке Python есть модуль unittest.
Документация: unittest — Unit testing framework
Пример структуры проекта:
calc.py код
test_calc.py тестыcalc.py:
test_calc.py:
Запуск тестов из папки проекта:
Или точечно:
Паттерн AAA: Arrange, Act, Assert
Хороший unit-тест обычно содержит три части:
Arrange подготовка данных
Act вызов тестируемой функции
Assert проверка результатаЭто помогает писать тесты читаемо.
Что тестировать в первую очередь
граничные случаи (пустые списки, ноль, отрицательные значения);
некорректный ввод (проверка, что выбрасывается исключение);
типичные кейсы, которые реально встречаются в задаче.Сторонние инструменты тестирования
В реальных проектах часто используют pytest, но для базового курса достаточно unittest.
Если хотите посмотреть, как выглядит альтернативный подход:
pytest DocumentationОсновы стиля кода: как писать читаемо
Стиль кода — это правила оформления, которые делают программы:
понятными для вас через неделю;
понятными для других;
проще поддерживаемыми.Главный документ по стилю для Python — PEP 8.
PEP 8 — Style Guide for Python CodeБазовые правила PEP 8, которые стоит применить сразу
Отступы: 4 пробела.
Имена:
- функции и переменные:
snake_case
- классы:
CamelCase
- константы:
UPPER_CASE
Пробелы вокруг операторов: a + b, а не a+b.
Пустые строки между крупными блоками (например, между функциями) улучшают чтение.Импорты: порядок и читаемость
Часто используемый порядок:
стандартная библиотека
сторонние пакеты
ваши модули проектаПлохой пример:
Лучше:
Докстроки и комментарии
Комментарии объясняют почему, а не что (что видно из кода).
Докстроки описывают назначение функции и её параметры.Документация: PEP 257 — Docstring Conventions
Автоформатирование и линтеры
Чтобы не спорить со стилем вручную, используют инструменты:
форматтер приводит код к единому виду;
линтер находит подозрительные места и стилистические ошибки.Популярные варианты:
black форматирование
-
Black documentation
ruff быстрый линтер
-
Ruff documentationПример использования (в активированном виртуальном окружении):
Практическая идея для учебных проектов:
сначала доведите программу до корректной работы;
затем прогоните форматирование;
затем включайте линтер и исправляйте предупреждения постепенно.Как связать всё вместе: отладка + тесты + стиль
Один из удобных рабочих процессов для небольших программ:
Напишите функцию, которая решает маленькую задачу.
Запустите на нескольких примерах.
Если ошибка:
- прочитайте traceback;
- локализуйте место;
- используйте
print() или
breakpoint().
Когда исправили — добавьте unit-тест на этот случай.
Приведите код к стилю (автоформатирование помогает).Итоги
Теперь у вас есть три практических навыка, которые превращают набор знаний Python в уверенную разработку:
вы умеете читать traceback и применять простую отладку через print() и breakpoint();
понимаете, зачем нужны тесты, и умеете писать базовые unit-тесты на unittest;
знаете ключевые правила стиля (PEP 8) и понимаете роль форматтеров и линтеров.Эти навыки особенно важны, когда вы начинаете писать программы из нескольких модулей, работать с файлами и расширять проекты: ошибки становятся разнообразнее, а поддерживать код без тестов и стиля становится заметно сложнее.