2025, Nov 08 15:02
Как следить за переменной в цикле с помощью Pdb: команда display
Узнайте, как в Pdb настроить автоматический вывод переменных с помощью команды display. Поставьте брейкпоинт в цикле и наблюдайте значения без ручных print.
Когда вы отлаживаете Python с помощью Pdb и хотите посмотреть, как меняется переменная внутри цикла, бесконечно нажимать continue и печатать print быстро превращается в механическую рутину. Ритм работы сбивается, консоль засоряется, и всё равно можно прозевать изменение. Есть более аккуратный способ показывать значения при каждом срабатывании точки останова без ручных print.
Постановка задачи
Возьмём простой скрипт: значения из списка обрабатываются в цикле. Наша цель — наблюдать за переменной цикла каждый раз, когда выполнение останавливается на точке останова в теле цикла.
vals = [12, 3, 4, 10, 23, 1]
def mul_twice(arg):
return 2 * arg
for item in vals:
outcome = mul_twice(item)
Поставить точку останова на присваивание внутри цикла и на каждой остановке печатать переменную — вариант рабочий, но он однообразный и под давлением легко ошибиться.
Что происходит на самом деле
Pdb останавливается именно там, где вы указали, но ничего не показывает, пока вы явно об этом не попросите. Вызывать print после каждого continue — это фактически ручной цикл наблюдения, который приходится выполнять самому. Нужен другой подход: чтобы отладчик автоматически выводил переменную при каждой остановке без дополнительных команд.
Решение: используйте display в Pdb
Для такой ситуации в Pdb есть встроенная команда. Один раз сообщите отладчику, за чем нужно следить, — и дальше значение будет появляться автоматически. Команда выглядит просто:
(Pdb) display variable
После этого отладчик при каждой остановке выводит текущее и предыдущее значения переменной. Ниже показано, как выглядит сессия при отслеживании переменной цикла на точке останова:
$ python -m pdb program.py
> /tmp/program.py(1)<module>()
-> a = [12, 3, 4, 10, 23, 1]
(Pdb) b 9
Breakpoint 1 at /tmp/program.py:9
(Pdb) c
> /tmp/program.py(9)<module>()
-> b = compute(i)
(Pdb) display i
display i: 12
(Pdb) c
> /tmp/program.py(9)<module>()
-> b = compute(i)
display i: 3 [old: 12]
(Pdb) c
> /tmp/program.py(9)<module>()
-> b = compute(i)
display i: 4 [old: 3]
(Pdb) c
> /tmp/program.py(9)<module>()
-> b = compute(i)
display i: 10 [old: 4]
(Pdb) c
> /tmp/program.py(9)<module>()
-> b = compute(i)
display i: 23 [old: 10]
Однажды настроив, вы будете видеть значение на каждой паузе без лишнего ввода — пошаговая проверка становится заметно плавнее.
Почему это важно
Автоматический вывод избавляет от повторяющихся команд, снижает когнитивную нагрузку и позволяет сосредоточиться на сути, а не на механике сессии отладки. Одновременное отображение текущего и предыдущего значений помогает быстро заметить неожиданные переходы, пока вы проходите точки останова.
Итоги
Если вы отслеживаете переменную на нескольких остановках в Pdb, один раз настройте display — остальное отладчик сделает сам. Поставьте точку останова на значимой строке внутри цикла, включите display для нужной переменной и двигайтесь с continue. Сессия будет лаконичной, а внимание — на поведении, которое вы изучаете.
Статья основана на вопросе с StackOverflow от Hamid Rouhani и ответе от Hamid Rouhani.