Рубрики
Без рубрики

Отладка в Python

Узнайте, как легко отлаживать приложение Python с помощью PDB.

Автор оригинала: 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() . С этими двумя строками на месте, если мы попытаемся запустить наше приложение снова, мы получим такой вывод

Точкой останова в этом случае являются две строки || import pdb; || и || pdb.set_trace() || . С этими двумя строками на месте, если мы попытаемся запустить наше приложение снова, мы получим такой вывод

Интерфейс похож на интерфейс интерактивной оболочки, предоставляемой Python. Мы можем проверить значения, переданные в функцию, введя их:

Интерфейс похож на интерфейс интерактивной оболочки, предоставляемой Python. Мы можем проверить значения, переданные в функцию, введя их:

Чтобы перейти к следующей строке, мы используем ключ n , что означает next , чтобы шагнуть вниз по коду строка за строкой

Чтобы перейти к следующей строке, мы используем ключ || 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, in 
    functionB(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, поэтому мы поместим туда вашу точку останова и пройдем через приложение строка за строкой

Мы можем не быть уверены, откуда берется ошибка, если мы только знакомимся с 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 .

Счастливой Отладки.