Отладчик вместо print: как пользоваться в VS Code
Показываем на Python 3.12, как поставить точку останова в VS Code, пройти код по шагам, проверить значения переменных и найти ошибку без россыпи временных print.

Если вы добавляете print() в каждую ветку программы, а потом удаляете эти строки по одной, пора перейти к отладчику. Ниже — практический сценарий для Python 3.12 и VS Code: за 15–20 минут вы запустите программу в режиме отладки, остановитесь на нужной строке, посмотрите локальные переменные и поймёте, почему функция вернула неверный результат.
Что подготовить до запуска
Нужны три вещи:
- Python 3.12, доступный из терминала командой
python --versionилиpython3 --version; - VS Code;
- официальное расширение Python от Microsoft, установленное через раздел Extensions.
Создайте отдельную папку проекта и файл discount.py. Вставьте в него полный пример:
from decimal import Decimal
def calculate_total(price: Decimal, quantity: int, discount: Decimal) -> Decimal:
subtotal = price * quantity
discount_amount = subtotal * discount / Decimal("100")
return subtotal - discount_amount
def main() -> None:
product_price = Decimal("1200")
product_quantity = 3
discount_percent = Decimal("10")
total = calculate_total(
product_price,
product_quantity,
discount_percent,
)
print(f"Итого: {total} руб.")
if __name__ == "__main__":
main()
Запустите файл обычным способом. В терминале должно появиться Итого: 3240 руб.. Это контрольная точка: сначала убедитесь, что программа вообще стартует без отладчика.
Как запустить отладку
- Откройте папку проекта в VS Code. Не отдельный файл, а именно папку через File → Open Folder. Так редактор корректнее определит рабочий каталог. Проверка: имя папки появится в панели Explorer слева.
- Выберите интерпретатор Python. Нажмите на версию Python в нижней панели VS Code и выберите среду с Python 3.12. Если версии в списке нет, проверьте установку Python и перезапустите редактор. Проверка: внизу отображается выбранный интерпретатор.
- Поставьте точку останова. Откройте
discount.pyи щёлкните слева от номера строки сdiscount_amount = .... Появится красный круг. Проверка: красная точка видна рядом с номером строки. - Запустите отладчик. Нажмите Run and Debug в боковой панели или клавишу
F5. Если VS Code попросит выбрать конфигурацию, выберите запуск текущего Python-файла. Проверка: выполнение остановится на строке с красной точкой, а строка подсветится жёлтым. - Посмотрите значения. Наведите курсор на
subtotalили откройте раздел Variables в панели Run and Debug. До выполнения текущей строки значениеdiscount_amountещё не вычислено. Проверка:subtotalравен3600, аdiscountравенDecimal("10"). - Выполните текущую строку. Нажмите Step Over или клавишу
F10. Отладчик перейдёт к строкеreturn, а в списке переменных появитсяdiscount_amountсо значением360. Проверка: значение рассчитано до перехода на следующую строку. - Зайдите внутрь функции. Перезапустите отладку и поставьте точку останова на вызове
calculate_total(...). Нажмите Step Into илиF11. Отладчик откроет тело функции. Проверка: текущий файл и строка изменились, а в Variables появились параметрыprice,quantityиdiscount. - Выйдите из функции. Нажмите Step Out или используйте команду выхода из текущей функции. Выполнение вернётся в
main(). Проверка: отладчик остановится после вызоваcalculate_total, а переменнаяtotalполучит значение3240.
Почему это удобнее print(): отладчик показывает состояние программы в конкретный момент и не меняет её код. Вам не нужно придумывать подписи вроде print("step 7", value) и потом чистить их перед коммитом.
Точка останова отвечает на вопрос «что было в этой строке», а пошаговое выполнение — «как программа сюда пришла».
Как найти ошибку, а не просто посмотреть переменные
Проверяйте значения перед подозрительной операцией
Представьте, что итоговая сумма стала равна 324000. Поставьте точку останова перед вычислением скидки и проверьте три значения: цену, количество и процент скидки. Если product_quantity содержит 300, ошибка появилась раньше — в источнике данных или при преобразовании ввода.
Отладчик показывает причину, но не исправляет её. Если значение уже неверно в момент остановки, двигайтесь назад по цепочке вызовов и ищите место, где оно изменилось.
Используйте условную точку останова
В цикле из тысячи элементов обычная точка останова остановит программу слишком рано и заставит нажимать продолжение сотни раз. Щёлкните правой кнопкой по точке останова и задайте условие, например quantity > 100. Тогда выполнение остановится только на проблемном случае.
Условие должно быть корректным выражением Python и обращаться к переменным, существующим в этой строке. Проверка: рядом с точкой появляется признак условия, а программа не останавливается на элементах, которые ему не соответствуют.
Добавляйте выражения в Watch
В панели отладки можно следить не только за отдельной переменной, но и за выражением: например, subtotal - discount_amount или type(total). Это удобно, когда ошибка связана с типом данных или промежуточным результатом.
Watch вычисляется в текущем контексте. После выхода из функции локальные переменные этой функции могут стать недоступны — это нормальное поведение, а не потеря данных.
Step Over, Step Into и Step Out: что нажимать
Три команды похожи, но ведут себя по-разному:
- Step Over, F10 — выполнить текущую строку, не заходя внутрь вызванной функции. Используйте для библиотечного или уже проверенного кода.
- Step Into, F11 — перейти внутрь функции на текущей строке. Нажимайте, когда подозреваете ошибку в собственном вызове.
- Step Out — закончить текущую функцию и вернуться к месту вызова. Это быстрее, чем проходить оставшиеся строки вручную.
Кнопка Continue продолжает выполнение до следующей точки останова. Если новых точек нет, программа дойдёт до конца, а отладочная сессия завершится.
Точка останова1 — место в коде, где отладчик временно приостанавливает выполнение программы. Она не является ошибкой и обычно не попадает в исполняемый файл.
Если отладчик не останавливается
Красная точка есть, но программа проходит мимо
Проверьте, что запускаете именно тот файл, где поставили точку. Частая причина — открытый discount.py и запуск другого скрипта из терминала. Запустите текущий файл через Run and Debug, а не старую конфигурацию.
Появляется NameError: name '...' is not defined
Код обращается к имени, которому не присвоено значение в текущей области видимости. Остановитесь перед строкой с ошибкой и посмотрите Variables. Если переменной нет, проверьте написание и порядок выполнения строк.
Появляется ModuleNotFoundError: No module named '...'
VS Code использует не ту среду Python или пакет не установлен в выбранном окружении. Сначала сравните интерпретатор в нижней панели с тем, которым вы запускаете файл в терминале. Для встроенного примера сторонние пакеты не нужны, поэтому такая ошибка обычно означает запуск другого файла или лишний импорт.
Появляется SyntaxError до остановки на точке
Python не смог разобрать файл, поэтому выполнение не началось. Исправьте строку и символ, на которые указывает сообщение, затем запустите отладчик снова. Точка останова сработает только после успешного разбора всего файла.
Программа сразу завершается
Уберите точку останова из строки, которая не выполняется, и поставьте её внутри реально вызываемой функции. В примере это строки внутри main() и calculate_total(). Также убедитесь, что файл запускается, а условие if __name__ == "__main__" не было изменено.
Где подход ломается
Локальный отладчик не заменяет логи и метрики в рабочем сервисе. Поставленная точка останова может остановить процесс, занять рабочий поток и ухудшить состояние приложения. Особенно опасно делать это в обработчике HTTP-запросов, очереди задач или транзакции базы данных.
В продакшене сначала воспроизводите проблему в тестовой среде на обезличенных данных. Если это невозможно, используйте структурированные логи, трассировку и безопасный режим отладки без вывода паролей, токенов и персональных данных. Инвалидация кеша и профилирование — отдельные темы; здесь важен именно поиск неверного шага выполнения.
Что сделать дальше
Возьмите собственную функцию, в которой сейчас больше трёх временных print(), и замените их одной точкой останова. Сначала проверьте входные параметры, затем пройдите функцию через F10, а при подозрении на вложенный вызов используйте F11. После исправления удалите временные точки, запустите тесты и оставьте в проекте только те логи, которые действительно нужны в эксплуатации.
IT-архитектор / SQL-оптимизатор: Поиск N+1, оптимизация запросов, code review, поиск багов.
Спросить за 20 ₽Источники: Python 3.12 — отладчик pdb, Visual Studio Code — Python debugging
Частые вопросы
Нужно ли удалять все print() перед использованием отладчика?
Почему F5 запускает не тот Python-файл?
Что делать, если у меня другая версия Python или VS Code?
Можно ли поставить точку останова внутри сторонней библиотеки?
Почему условная точка останова не срабатывает?
Безопасно ли использовать отладчик на рабочем сервере?
Материал носит информационный характер и подготовлен редакцией «Агентуры». Он не является офертой, рекламой или индивидуальной консультацией. Упомянутые продукты, компании и торговые знаки принадлежат их правообладателям. Перед принятием решений, влекущих юридические или финансовые последствия, обратитесь к профильному специалисту.