Основы отладки(debugging) в Python, часть первая ParseError

Emil Garipov
5 min readApr 28, 2020

--

Оглавление:

  1. Программирование и мозг.
  2. Что такое отладка.
  3. Сообщения об ошибках. ParseError
  4. Способы обнаружения ошибок в коде

Программирование и мозг.

Одним из важнейших навыков, которым необходимо овладеть в программировании это умение отлаживать свои программы.

Программирование для меня в некотором роде странная вещь. Не скажу за всех программистов, но для себя я понял, что трачу огромную часть времени, пытаясь заставить программу работать. Я борюсь, напрягаюсь и провожу часы в глубоком разочаровании, пытаясь заставить свою программу работать корректно. Потом, когда понимаю, что добился своего и программа работает так как я хотел, наступает время эйфории. А секрет в том, что когда вы добиваетесь успеха, вы счастливы, ваш мозг высвобождает гормоны счастья — серотонин, дофамин, эндорфин и окситоцин, которые заставляют вас чувствовать себя счастливым. Оказывается, нашему мозгу все равно, успешно ли мы написали “Hello World”, или спарсили огромный конфиг с тысячи сетевых устройств (поверьте мне, это ужасно тяжело), мы все равно получим небольшую порцию гормонов, которые сделают нас счастливыми. Когда мы счастливы, мы хотим продолжать дальше и начинаем решать следующую маленькую проблему. И понимание процесса отладки как ни что иное может нам помочь в решении проблем в программировании, что в свою очередь запустит механизм получения гормонов счастья.

Что такое отладка

Отладка(debugging) программы — это немного другой способ мышления, чем написание программы. Процесс отладки больше похож на навык решения проблем. Позволяет посмотреть на задачу с разных сторон и попробовать найти ошибку.

Обычно начинающие программисты винят во всех своих проблемах сам Python или другой язык программирования, знакомо да? И я не был исключением. Я ни в коем случае не считаю себя продвинутым, мне еще учиться и учиться, но после множества попыток ко мне пришло озарение(что-то типа Эврика, как у Архимеда или яблока у Ньютона). Я понял, что мне нужно научиться двум вещам для успешной работы моей программы — это, во-первых, понимать, что происходит, когда возникает та или иная ошибка и во-вторых овладеть основными методами их нахождения. Таким образом я осознал, что Python не является проблемой, проблема была в подходе к программированию на нем, который нужно было изменить. Поэтому я решил начать с того, какие основные сообщения об ошибках возникают, и понять почему они возникают.

Сообщения об ошибках

Многие проблемы в программе приведут к сообщению об ошибке, и, просто посмотрев на код сложно определить есть в нем какая-то ошибка или нет. К примеру, сможете ли вы увидеть, что не так в нижеприведенном коде, просто взглянув на код? Пример взят из книги Наташи Самойленко “Python для сетевых инженеров”

Код 1

Возможно вы сразу увидите ошибку, а может и нет. Наш мозг склонен видеть то, что мы предполагаем увидеть. Это одно из когнитивных искажений, поэтому иногда очень трудно обнаружить проблему, просто взглянув на код. Особенно, когда это наш собственный код, и мы уверены, что сделали все правильно!

Вы можете скопировать код в интерпретатор Python, запустить его и увидеть следующую ошибку:

Ошибка 1

Теперь у нас есть сообщение об ошибке, которое может быть полезным. SyntaxError говорит нам, что у нас в коде недопустимый синтаксис. Также оно говорит нам, что ошибка находится на 16-й строке:

line2 = command2.strip().split()[-1].split(‘,’)

Это действительно полезная информация. Теперь вернемся к нашему коду и если внимательно посмотреть на 16-ую строку, то увидим, что с этой строкой все в порядке. Не кажется ли вам странным почему сообщение об ошибке указывает именно на эту строку? Мне тоже так казалось, пока я не стал изучать какие именно бывают сообщения об ошибках и почему они так работают в Python.

А начнем мы с одной из самых распространенных сообщений об ошибке ParseError.

ParseError

Сообщение об ошибке ParseError, по другому еще называется SyntaxError, происходит, когда вы делаете ошибку в синтаксисе кода. Синтаксические ошибки подобны грамматическим ошибкам. Если не использовать, скажем, в этой статье точки и запятые, то читателям будет сложно понять, что я пытаюсь описать. Аналогичным образом, на Python существуют определенные грамматические правила, которым необходимо следовать, иначе Python не сможет понять, что вы пытаетесь сказать.

Обычно ошибки ParseErrors можно отследить до недостающих знаков препинания, таких как круглые скобки(), кавычки «» или запятые “,” . Имейте ввиду, что в Python запятые используются для разделения параметров функций.

Давайте еще раз вернемся к раннее приведенному коду:

Код 2

С первого взгляда, тем более если вы только начинаете программировать, можно не заметить ошибки. Но взглянув на сообщение об ошибке, можно увидеть, что ошибка указана в 16-ой строке:

line2 = command2.strip().split()[-1].split(‘,’)
Ошибка 2

Хотя в этой строке не видно никакой ошибки:

Код 3

Вместо этого, давайте вернемся к предыдущей, 15-ой строке:

Код 4

Здесь мы видим, что скобка между запятой ‘,’и line2 не закрыта, а это синтаксическая ошибка. Так почему же Python показывает, что ошибка в 16-ой строке(см. Ошибка 1), а не 15-ой, где она явно присутствует? Для этого нужно понять способ работы Python со скобками. Python позволяет параметрам находиться в нескольких строках внутри скобок, он будет продолжать сканировать последующие строки в поисках закрывающей правой круглой скобки. В примере ниже мы видим, что можно переносить параметры в следующую строку. В нашем случае я перенес закрывающую скобку в 16- строку, и если запустить код, то все будет работать:

Код 5

Однако в коде с ошибкой(см. Код 1), Python в 16-ой строке находит следующий line2 и хочет интерпретировать его как следующий параметр функции. Но, для того, чтобы отделить предыдущую(15-ую) строку от переменной line2 не хватает запятой. Поэтому, с точки зрения Python, ошибка — это пропущенная запятая. Ну а с нашей точки зрения — это пропущенная скобка.

Круглые скобки должны быть закрыты, иначе Python решит, что вы пытаетесь включить в функцию еще какие-то дополнительные параметры.

Давайте рассмотрим тот же пример, но на этот раз представим, что в 15-ой строке у нас нет ошибки, мы ее нашли и закрыли скобку. Но из-за невнимательности не забыли закрыть скобку после print(vlans в 19- ой строке:

Код 6

После запуска кода возникает следующая ошибка:

Ошибка 3

Здесь мы опять получили синтаксическую ошибку, но она будет как “unexpected EOF while parsing”. EOF означает End Of File, т.е. “конец файла”, а “parsing” — можно заменить на “чтение”. Поэтому “unexpected EOF while parsing” означает, что Python столкнулся с концом файла раньше, чем ожидал.

Способы обнаружения ошибок в коде

Так каким же способом можно найти эти проблемы в коде?

Один из способ, который может быть очень ценным в этой ситуации, это просто начать комментировать со строки, которая помечена в сообщении об ошибке. Давайте вернемся к первоначальному коду с ошибкой во 15-ой строке, где мы забыли закрыть скобку(см.Код ниже) и закомментируем строку, в которой указана ошибка(16 строка). В нашем случае это третья строка. Затем запустим скрипт:

Если мы закомментим 16-у строку, то сообщение об ошибке изменится на 17-ю.

Проверив 17-ую строку, мы видим, что в ней нет никакой ошибки. Таким образом, можно сделать вывод, что ошибка не в последующих строках, а скорее всего в предыдущих.

В следующей статье мы рассмотрим следующие виды сообщений об ошибках:TypeError, ValueError и NameError.

Stay tuned.

Подписывайтесь на телеграм-канал — https://t.me/automate_net

--

--