Автор оригинала: Oyeniyi Abiola.
Одна из причин, почему я люблю язык программирования Python, заключается в том, насколько проста отладка. Вам не нужна полноценная IDE, чтобы иметь возможность отлаживать ваше приложение Python. Мы пройдем через процесс отладки простого скрипта Python с помощью модуля pdb
из стандартной библиотеки Python, которая поставляется с большинством установок Python.
Давайте взглянем на следующий простой фрагмент:
def funcA(first_val, second_val): result = (first_val*2) - (second_val/4) return result def functionB(first_val=23, last_val=72): response = funcA(first_val, last_vale) result = response * first_val / 7 return result functionB(33,88) # we are evaluating the funciton.
Если мы попытаемся запустить приведенный выше фрагмент кода, то получим ошибку:
Traceback (most recent call last): File "", line 1, in File " ", line 2, in functionB NameError: global name 'last_vale' is not defined
Чтобы выяснить, что не так с этим фрагментом, нам нужно знать, где мы должны разместить нашу точку останова. Точка останова указывает интерпретатору Python приостановить выполнение в определенной точке нашего приложения.
Из приведенного выше сообщения об ошибке мы можем сделать вывод, что проблема исходит от функции function B
. Но в зависимости от нашего опыта мы можем не быть уверены, что является причиной ошибки.
Чтобы отладить проблему, мы добавим точку останова в начало реализации нашей функции B
# we would place our break point here import pdb pdb.set_trace() response = funcA(first_val, last_vale) result = response * first_val / 7 return result
Точкой останова в этом случае являются две строки import pdb;
и pdb.set_trace()
. С этими двумя строками на месте, если мы попытаемся запустить наше приложение снова, мы получим такой вывод
Интерфейс похож на интерфейс интерактивной оболочки, предоставляемой Python. Мы можем проверить значения, переданные в функцию, введя их:
Чтобы перейти к следующей строке, мы используем ключ n
, что означает next
, чтобы шагнуть вниз по коду строка за строкой
Из вышесказанного видно, что, когда мы переходили к следующей строке, ошибка, с которой мы столкнулись ранее, возникла снова. Таким образом, мы уверены, что проблема в нашем коде происходит на линии, которую мы только что запустили.
Чтобы заставить python продолжить выполнение программы, мы набираем c
, что означает continue
, и программа выполняется как обычно.
Теперь предположим, что мы исправили нашу реализацию, убедившись, что используется правильное имя переменной, и удалили точку останова, потому что мы не хотим, чтобы программа останавливалась
def funcA(first_val, second_val): result = (first_val * 2) - (second_val / 0) return result def functionB(first_val=23, last_val=72): # we would place our break point here response = funcA(first_val, last_val) result = response * first_val / 7 return result functionB(33, 88)
На этот раз мы столкнемся с другой ошибкой
$ python sample.py Traceback (most recent call last): File "sample.py", line 13, infunctionB(33, 88) File "sample.py", line 8, in functionB response = funcA(first_val, last_val) File "sample.py", line 2, in funcA result = (first_val * 2) - (second_val / 0) ZeroDivisionError: integer division or modulo by zero
Мы можем не быть уверены, откуда берется ошибка, если мы только знакомимся с python, но с помощью pdb
мы можем постепенно продвигаться туда, где возникает ошибка. Мы знаем, что начальная точка вашего приложения находится в functionB
function, поэтому мы поместим туда вашу точку останова и пройдем через приложение строка за строкой
Мы уже знакомы с n
переходим к следующей строке. Но теперь мы видим s
. Это означает шаг
, который перемещает поток управления в функционал
. В functional
мы продолжаем нажимать n
строка за строкой, пока не доберемся до той части нашего кода, которая выдает ошибку.
На самом деле существует больше команд, все из которых можно изучить по адресу https://docs.python.org/2/library/pdb.html. Но для ваших повседневных потребностей в отладке n
, s
и c
– это все, что вам нужно.
Одна вещь, которую мы должны иметь в виду, если мы решим отлаживать наше приложение таким образом, – это убедиться, что мы не используем значения одного слова в качестве имен переменных в нашем приложении. Возьмем к примеру
import pdb pdb.set_trace() n= 84 s = 45 c = 23
Если бы мы хотели перейти к следующей строке и набрали n
, мы бы столкнулись с конфликтом, потому что n
имеет особое значение в pdb
и наша переменная также называется n
.
Счастливой Отладки.