Зачем нужна отладка?
Даже опытные программисты пишут код с ошибками. Умение быстро находить и исправлять ошибки — один из важнейших навыков разработчика.
💡 Виды ошибок:
- Синтаксические — пропущенные скобки, двоеточия, неверные отступы
- Логические — программа работает, но выдаёт неверный результат
- Исключения (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
Каждая среда разработки предоставляет горячие клавиши для отладки. Вот основные:
| Действие | IDLE | VS Code | PyCharm |
|---|---|---|---|
| Точка останова (breakpoint) | — | F9 | Клик на номер строки |
| Запуск отладки | — | F5 | Shift+F9 |
| Следующая строка (Step Over) | — | F10 | F8 |
| Зайти внутрь (Step Into) | — | F11 | F7 |
| Выйти из функции (Step Out) | — | Shift+F11 | Shift+F8 |
| Продолжить до следующей точки (Continue) | — | F5 | F9 |
| Запуск файла | F5 | Ctrl+F5 | Shift+F10 |
| Остановка выполнения | Ctrl+C | Shift+F5 | Ctrl+F2 |
| Перезапуск | F5 | Ctrl+Shift+F5 | Ctrl+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 (отступы, именование переменных). Это не инструмент отладки, а свод правил для написания читаемого кода