Что такое Python Debugger (PDB)?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Python Debugger (PDB) — отладчик Python
PDB (Python Debugger) — это встроенный интерактивный отладчик для Python. Он позволяет выполнять код пошагово, инспектировать переменные, устанавливать точки останова и отслеживать ошибки. PDB входит в стандартную библиотеку и доступен из коробки.
Почему PDB важен
- Отладка — находить баги без print() вызовов
- Понимание кода — пошаговое выполнение логики
- Инспекция состояния — смотреть значения переменных
- Контроль потока — прыгать через функции или выполнять построчно
- Встроенный — не нужно устанавливать дополнительные пакеты
Запуск PDB
Способ 1: breakpoint() — новый стиль (Python 3.7+)
def calculate_total(items):
total = 0
for item in items:
breakpoint() # Здесь произойдёт остановка
total += item.price * item.quantity
return total
calculate_total([Item(10, 2)])
Выполнение программы остановится в точке breakpoint() и откроется сессия PDB.
Способ 2: pdb.set_trace() — классический способ
import pdb
def calculate_total(items):
total = 0
for item in items:
pdb.set_trace() # То же самое, что breakpoint()
total += item.price * item.quantity
return total
Способ 3: запуск скрипта с PDB
python -m pdb script.py
Способ 4: post-mortem отладка (после ошибки)
import pdb
import traceback
try:
calculate_total(items)
except Exception:
traceback.print_exc()
pdb.post_mortem() # Откроет отладчик в месте ошибки
Основные команды PDB
Навигация по коду:
n (next) — выполнить следующую строку
s (step) — зайти внутрь функции
c (continue) — продолжить выполнение до следующего breakpoint
l (list) — показать текущий код (5 строк вверх/вниз)
p variable — распечатать значение переменной
pp expression — красивый вывод сложного объекта
Просмотр контекста:
w (where) — показать стек вызовов
u (up) — перейти на уровень выше в стеке
d (down) — перейти на уровень ниже в стеке
args — показать аргументы текущей функции
Точки останова:
b (break) file.py:10 — установить breakpoint на строку 10
cl (clear) — удалить все breakpoints
h (help) — справка по командам
Выполнение выражений:
!variable = value — изменить значение переменной
!import sys — выполнить код Python
Практический пример
Код с ошибкой:
def divide_numbers(a, b, c):
result = (a + b) / c
return result * 100
print(divide_numbers(10, 5, 0)) # ZeroDivisionError!
Добавляем breakpoint:
def divide_numbers(a, b, c):
breakpoint() # Остановка здесь
result = (a + b) / c
return result * 100
print(divide_numbers(10, 5, 0))
Сессия отладки:
> /path/to/script.py(2)divide_numbers()
-> result = (a + b) / c
(Pdb) p a
10
(Pdb) p b
5
(Pdb) p c
0
(Pdb) p a + b
15
(Pdb) l
1 def divide_numbers(a, b, c):
2 -> result = (a + b) / c
3 return result * 100
(Pdb) n # Выполнить следующую строку
ZeroDivisionError: division by zero
Сложный пример: отладка цикла
def process_users(users):
results = []
for user in users:
breakpoint() # Отладка каждого пользователя
user_data = {
'id': user['id'],
'name': user['name'].upper(),
'email': user.get('email', 'N/A')
}
results.append(user_data)
return results
users = [
{'id': 1, 'name': 'alice', 'email': 'alice@example.com'},
{'id': 2, 'name': 'bob'},
]
process_users(users)
Сессия:
(Pdb) p user
{'id': 1, 'name': 'alice', 'email': 'alice@example.com'}
(Pdb) pp user_data
{'id': 1,
'name': 'ALICE',
'email': 'alice@example.com'}
(Pdb) c # Продолжить
> /path/to/script.py(10)process_users()
-> for user in users:
(Pdb) p user
{'id': 2, 'name': 'bob'}
(Pdb) p user.get('email', 'N/A')
'N/A'
Условные Breakpoints
def find_user(users, target_id):
for user in users:
if user['id'] == target_id:
breakpoint() # Остановка только для нужного пользователя
process_user(user)
# Или более красивый способ:
def find_user(users, target_id):
for user in users:
if user['id'] == target_id:
pdb.set_trace()
process_user(user)
PDB и IDE
PyCharm — встроенный отладчик превосходит PDB, но PDB всё равно полезен:
- F7 для step into
- F8 для next
- F9 для continue
VS Code — встроенный отладчик с визуальным интерфейсом
Vim — используй PDB в терминале
Советы профессионалов
- Используй pp() для больших объектов
(Pdb) pp large_dict
- Цикл по стеку вызовов
(Pdb) w # показать стек
(Pdb) u # поднять на уровень
(Pdb) d # опуститься
- Встроенная справка
(Pdb) h n # справка по команде 'n'
- Не забывай exit из PDB
(Pdb) q # quit
Сравнение подходов отладки
print() — плохо
print(f"user = {user}")
print(f"total = {total}")
# Много строк, нужно удалять после
logging — лучше
logger.debug(f"user = {user}")
# Остаётся в коде, легко отключить
PDB — лучше всего для отладки
breakpoint() # Интерактивная инспекция
# Вся информация под рукой
PDB — это мощный инструмент, который должен знать каждый Python разработчик. Он сэкономит вам часы на отладку сложных проблем.