Урок 24 Отладка

print(), pdb, логирование — как находить и исправлять ошибки в коде

⏱ ~12 мин чтения· 📘 Базовый

Зачем нужна отладка?

Даже опытные программисты пишут код с ошибками. Умение быстро находить и исправлять ошибки — один из важнейших навыков разработчика.

💡 Виды ошибок:

  • Синтаксические — пропущенные скобки, двоеточия, неверные отступы
  • Логические — программа работает, но выдаёт неверный результат
  • Исключения (runtime) — ошибки во время выполнения: деление на ноль, неверный тип данных

Отладка с помощью print()

Самый простой и часто используемый способ — вывод промежуточных значений:

def calculate_total(prices, discount):
    print(f"DEBUG: prices = {prices}")        # смотрим входные данные
    total = sum(prices)
    print(f"DEBUG: total = {total}")           # промежуточный результат
    final = total * (1 - discount)
    print(f"DEBUG: final = {final}")           # итог
    return final

result = calculate_total([100, 200, 300], 0.1)
print(f"Результат: {result}")

💡 Совет: используйте префикс DEBUG: или >>>, чтобы легко отличить отладочный вывод от основного и быстро удалить его потом.

Отладка через {var=} (Python 3.8+)

Специальный синтаксис {var=} выводит имя переменной и её значение:

name = "Анна"
age = 25
print(f"{name=} {age=}")   # name='Анна' age=25

x = 10
y = 20
print(f"{x + y = }")       # x + y = 30

Встроенный отладчик pdb

Python включает интерактивный отладчик pdb. Он позволяет выполнять код по шагам, просматривать значения переменных и находить ошибки.

def buggy_function(a, b):
    result = a / b
    return result

x = 10
y = 0

# Устанавливаем точку останова прямо перед проблемным вызовом
breakpoint()  # выполнение остановится здесь, в консоли откроется pdb
print(buggy_function(x, y))

💡 Совет: функция breakpoint() появилась в Python 3.7 и это рекомендуемый способ. В старом коде можно встретить эквивалентную запись: import pdb + pdb.set_trace().

Основные команды pdb:

КомандаДействие
n (next)Выполнить следующую строку
s (step)Зайти внутрь функции
c (continue)Продолжить выполнение
p переменнаяВывести значение переменной
l (list)Показать текущий участок кода
q (quit)Выйти из отладчика

Модуль logging

logging — более продвинутый способ отслеживания работы программы. В отличие от print(), позволяет настраивать уровни важности сообщений и выводить их в файл.

import logging

# Настройка: уровень DEBUG и выше, запись в файл
logging.basicConfig(
    level=logging.DEBUG,
    format='%(asctime)s [%(levelname)s] %(message)s',
    filename='app.log'
)

def divide(a, b):
    logging.info("divide(%s, %s) вызвана", a, b)
    if b == 0:
        logging.error("Деление на ноль!")
        return None
    result = a / b
    logging.debug("Результат: %s", result)
    return result

print(divide(10, 2))   # 5.0
print(divide(10, 0))   # None

💡 Совет: в logging принято передавать значения через %s-плейсхолдеры, а не через f-строки: сообщение форматируется только если оно действительно будет выведено (например, при отключённом уровне DEBUG f-строка всё равно потратила бы время на форматирование).

Уровни логирования (по возрастанию):

  • DEBUG — подробная отладочная информация
  • INFO — общая информация о работе программы
  • WARNING — предупреждения
  • ERROR — ошибки
  • CRITICAL — критические ошибки

Горячие клавиши отладки в IDE

Каждая среда разработки предоставляет горячие клавиши для отладки. Вот основные:

ДействиеIDLEVS CodePyCharm
Точка останова (breakpoint)F9Клик на номер строки
Запуск отладкиF5Shift+F9
Следующая строка (Step Over)F10F8
Зайти внутрь (Step Into)F11F7
Выйти из функции (Step Out)Shift+F11Shift+F8
Продолжить до следующей точки (Continue)F5F9
Запуск файлаF5Ctrl+F5Shift+F10
Остановка выполненияCtrl+CShift+F5Ctrl+F2
ПерезапускF5Ctrl+Shift+F5Ctrl+F5

Основные команды пошагового выполнения:

  • Step Over (шаг с обходом, F10 в VS Code) — выполняет текущую строку. Если это вызов функции — выполняет её целиком, не заходя внутрь, и останавливается на следующей строке.
  • Step Into (шаг с заходом, F11 в VS Code) — заходит внутрь вызываемой функции и останавливается на её первой строке.
  • Step Out (выйти из функции, Shift+F11 в VS Code) — выполняет оставшийся код функции до конца и возвращается в вызывающий код.

💡 Совет: IDLE тоже имеет встроенный отладчик (меню Debug → Debugger, точки останова через контекстное меню в редакторе, кнопки в окне Debug Control), но в нём нет горячих клавиш для пошаговой отладки. Для более удобной отладки с горячими клавишами и панелью Watch используйте VS Code или PyCharm.

Панель Watch (наблюдение за переменными)

В отладчике (VS Code, PyCharm) есть панель Watch. В неё можно добавить интересующие переменные или выражения, и отладчик будет показывать их актуальные значения на каждом шаге выполнения:

def calc(x, y):
    result = x * y    # добавьте x, y и result в панель Watch
    return result

Панель Watch особенно полезна, когда нужно отследить, как меняется значение переменной во время выполнения циклов или вложенных вызовов функций.

Практические советы

  • Читайте сообщения об ошибках внимательно — Python указывает файл, строку и тип ошибки
  • Проверяйте входные данные — ошибка часто не там, где программа упала, а там, откуда пришли некорректные данные
  • Упрощайте — если не можете найти ошибку в большом коде, выделите проблемный участок и проверьте его отдельно
  • Используйте метод резиновой уточки (rubber duck) — объясняя код вслух, вы часто сами находите ошибку
  • Git — делайте коммиты после каждой работающей версии, чтобы можно было откатиться
  • PEP 8 — руководство по стилю оформления кода Python (отступы, именование переменных). Это не инструмент отладки, а свод правил для написания читаемого кода