Мастерство отладки Python: эффективные техники и лучшие практики
Отладка Python-кода для многих из нас сводится к добавлению print-выражений и попыткам понять, что происходит, основываясь на выводе. Это не идеально, но по какой-то причине люди просто не хотят трогать Python-отладчик.
Содержание
Использование print для отладки кода
Если вы из тех людей, кто использует print для отладки, я не осуждаю вас. Учиться Python — трудно. Программирование — трудно. Жизнь — трудно. Я понимаю, что изучение еще одной вещи кажется утомительным, если вы уже боретесь. И добавление этого print-выражения в ваш код… это просто легче. Небольшое признание: я всё ещё делаю это постоянно. Это не так плохо, как некоторые представляют.
Тем не менее, я научу вас маленькому трюку, который будет так же легко, как добавление print-выражений в ваш код. Однако этот трюк дает вам бесконечные возможности отладки и позволит вам покорять мир, если вам понадобится.
Установка breakpoint в Python-отладчике
Вам не нужна IDE для правильной отладки кода. Этот трюк всегда работает, даже в самом простом редакторе, и даже в Jupyter Notebooks.
Трюк сводится к этому: установке так называемого breakpoint с помощью инструкции breakpoint(). Вы можете вставить его в свой код, независимо от того, какой редактор или IDE вы используете, в той точке, где вы обычно ставили бы то хлопотное print-выражение.
Что происходит, когда вы это делаете? Давайте узнаем! Создайте простую программу, как ниже:
def add_two(x): return x + 2
for i in range(1, 10):
a = add_two(i)
breakpoint()
print(a)
Когда вы запускаете это, и неважно, делаете ли вы это в REPL, из командной строки или в вашей IDE, вы попадаете в Python-отладчик под названием PDB. Но что теперь?
Использование Python-отладчика
Когда я запускаю маленькую программу выше, это происходит:
$ python3 breakpointing.py > /home/erik/breakpointing.py(7)<module>() -> print(a) (Pdb)_
Есть несколько вещей, которые здесь видны:
- Показывается текущий запущенный файл (
breakpointing.py) - После этого показывается следующая команда, которая собиралась запуститься, но была прервана вызовом
breakpoint(). - И наконец, мы видим приглашение pdb, ждущее наш ввод.
Python-отладчик на самом деле является полностью функционирующей Python-оболочкой, как REPL.
В этой точке мы можем инспектировать текущее окружение. Давайте посмотрим, каково значение a прямо сейчас:
(Pdb) print(a) 3 (Pdb) print(i) 1
Вместо print можно также использовать специфичную для pdb команду p, так:
(Pdb) p a 3 (Pdb) p i 1
Выполнение следующей строки
Что, если мы хотим выполнить следующую строку кода? Есть два варианта:
- С
sилиstepвы выполняете текущую строку. Отладчик останавливается при первой возможной возможности после этого. - С
nилиnextвы также выполняете текущую строку, но теперь отладчик продолжает до следующей строки текущей функции.
Чтобы сделать это понятнее: step с радостью входит в вызов функции и останавливается внутри этой функции. В отличие от этого, next выполняет функцию до её возврата и останавливается на следующей строке.
Другие отладчики и IDE также называют это «step into» (вместо step) и «step over» (вместо next).
Теперь давайте используем эти два:
$ python3 breakpointing.py -> print(a) (Pdb) s 3 -> for i in range(1, 10): (Pdb) s -> a = add_two(i) (Pdb) n -> breakpoint() (Pdb) n -> print(a) (Pdb) n 4 -> for i in range(1, 10): (Pdb) s -> a = add_two(i) (Pdb) s --Call-- -> def add_two(x): (Pdb) s -> return x + 2 (Pdb) s --Return-- 5 -> return x + 2 (Pdb) s -> breakpoint() (Pdb)
Как вы видите, мы сначала делаем step over вызова add_two с n. Во второй раз мы делаем step into функцию с s.
Команды Python-отладчика
Есть больше команд, которые вы можете попробовать сами. Я не перечислю все, только самые полезные:
h(help): вывести все доступные команды. Также принимает аргумент, напримерh cговорит, что делает командаcc(continue): продолжить выполнение до следующего breakpointl(list): показать исходный код вокруг текущей строкиp: вывести результат следующего выражения. Можно использовать вместо вызоваprint()pp: pretty print, полезно для печати структур данных вроде словарей- restart: перезапустить текущую программу
Для полной документации перейдите на страницу Python-отладчика, где перечислены все команды.
Продолжайте учиться
Хотя это может быть супер полезным, стоит погрузиться в отладчик, который предлагает ваша IDE. Если вы пользователь VSCode, я написал руководство по отладке Python-кода в VSCode.

Python
- Мастерство ввода-вывода и импорта модулей в Python: Практическое руководство
- Функция print() в Python: практическое руководство с примерами
- Освоение строковых операций в Python: replace, join, split, reverse, преобразование регистра
- Python time.sleep(): как добавить задержки в код (пример)
- Печать в Python без перевода строки: мастерство параметра end и другие техники
- Максимизация прибыли с расширенным управлением коннектед флотом Ford
- Ускорьте производство: Как прототипирование улучшает ваш производственный процесс
- 5 проверенных стратегий повышения качества деталей из листового металла
- 3 проверенные стратегии улучшения плана ТО промышленного оборудования
- Мастерство дизайна ПП: необходимые советы и лучшие практики для инженеров