Debug python with idle

Настройка среды IDLE: как запустить пошаговое выполнение (debugger)

Как запустить пошагово код в IDLE, либо выделенный фрагмент кода? Например у меня есть рекрутивная функция, я не могу сообразить как она работает, поэтому хочу запустить пошаговую трассировку, чтобы видеть какой шаг когда выполняется, как это можно реализовать в стандартной среде питона IDLE

Например у меня есть рекрутивная функция, я не могу сообразить как она работает, поэтому хочу запустить пошаговую трассировку, чтобы видеть какой шаг когда выполняется, как это можно реализовать в стандартной среде питона IDLE

2 ответа 2

Насколько я знаю, в стандартном IDLE нет возможности запускать код пошагово.

Вы можете воспользоваться сторонним сервисом, например http://pythontutor.ru/visualizer/

1- не стандартный IDLE мне неизвестен 🙂 2- документация говорит, что есть debugger 3- Хотя для разработки, IDLE (вне учебного класса) обычно (когда есть возможность ПО ставить) не используют. Вот что создатель языка сказал: «Don’t waste time improving IDLE, the process is too slow / broken. Building something new will be quicke and much better.» Сейчас куча опций доступна для разных потребностей.

@ОлегФантанский если вы откроете debugger (должны увидеть: [DEBUG ON] ) и ваш скрипт по F5 или прямо в REPL код запустите, то нажимая на кнопки Step, Over в debugger вы можете вперёд по шагам двигаться.

Импортируете в свой модуль pdb

pdb — стандартный модуль отладки для python включенный в состав интерпретатора. Он будет отображаться в окне IDLE Debugger.

Читайте также:  Python lightgbm что это

ИМХО: По мере роста потребностей взгляните на PyCharm Comminity Edition — это бесплатная IDE для Python с очень хорошим отладчиком.

Это pdb в IDLE запускает. Это тоже debugger, но в IDLE есть свой встроенный debugger доступный из меню Debug.

Можно ставить breakpoint’ы с помощью правой кнопки мышы, но у меня с асинхронными вызовами это не работает.

Проверил, можно работать без pdb — нужно сначала открыть окно debugger, разрешить инкспектировать «globals», и в коде модуля (должен быть сохранен) поставить через контекстное меню breakpoint. Далее можно выполнять код пошагово с помощью «step». «Go» — отрабатывает до следующего breakpoint.

Источник

Борьба с багами

Следующий код определяет функцию add_underscores(), принимающую в качестве аргумента строковый объект и возвращающую новую строку – копию слова с каждым символом, окруженным подчеркиванием. Например, add_underscores(«python») вернет «_p_y_t_h_o_n_» .

🐍 Найдите и исправьте ошибки в коде на Python: отладка с IDLE

Запустим. Выполнение останавливается на строке с определением функции.

Нажмите кнопку Go, чтобы выполнить код до точки останова:

🐍 Найдите и исправьте ошибки в коде на Python: отладка с IDLE

Код останавливается перед циклом for в функции add_underscores(). Обратите внимание, что на панели Locals отображаются две локальные переменные – word со значением «hello», и new_word со значением «_»,

Нажмите кнопку Step, чтобы войти в цикл for. Окно отладки изменится, и новая переменная i со значением 0 отобразится на панели Locals:

🐍 Найдите и исправьте ошибки в коде на Python: отладка с IDLE

Переменная i – это счетчик для цикла for, который можно использовать, чтобы отслеживать активную на данный момент итерацию.

Нажмите кнопку Step еще раз и посмотрите на панель Locals – переменная new_word приняла значение «h_»:

🐍 Найдите и исправьте ошибки в коде на Python: отладка с IDLE

Это неправильно т. к. сначала в new_word было значение «_», на второй итерации цикла for в ней должно быть «_h_». Если нажать Step еще несколько раз, то увидим, что в new_word попадает значение e_, затем l_ и так далее.

Шаг 3: Определение ошибки и исправление

Как мы уже выяснили – на каждой итерации цикла new_word перезаписывается следующим символом в строке «hello» и подчеркиванием. Поскольку внутри цикла есть только одна строка кода, проблема должна быть именно там:

Код указывает Python получить следующий символ word, прикрепить подчеркивание и назначить новую строку переменной new_word. Это именно то неверное поведение, которое мы наблюдали.

Чтобы все починить, нужно объединить word[i] + » _» с существующим значением new_word. Нажмите кнопку Quit в окне отладки, но не закрывайте его. Откройте окно редактора и измените строку внутри цикла for на следующую:

new_word = new_word + word[i] + "_" 

Примечание: Если бы вы закрыли отладчик, не нажав кнопку Quit, при повторном открытии окна отладки могла появиться ошибка:

You can only toggle the debugger when idle

Всегда нажимайте кнопку Go или Quit, когда заканчиваете отладку, иначе могут возникнуть проблемы с ее повторным запуском.

Шаг 4: повторение шагов 1-3, пока ошибка не исчезнет

Сохраните изменения в программе и запустите ее снова. В окне отладки нажмите кнопку Go, чтобы выполнить код до точки останова. Понажимайте Step несколько раз и смотрите, что происходит с переменной new_word на каждой итерации – все работает, как положено. Иногда необходимо повторять этот процесс несколько раз, прежде чем исправится ошибка.

Альтернативные способы поиска ошибок

Использование отладчика может быть сложным и трудоемким, но это самый надежный способ найти ошибки в коде. Однако отладчики не всегда есть в наличии. В подобных ситуациях можно использовать print debugging для поиска ошибок в коде. PD задействует функцию print() для отображения в консоли текста, указывающего место выполнения программы и состояние переменных.

Например, вместо отладки предыдущего примера можно добавить следующую строку в конец цикла for:

Измененный код будет выглядеть следующим образом:

def add_underscores(word): new_word = "_" for i in range(len(word)): new_word = word[i] + "_" print(f"i = ; new_word = ") return new_word phrase = "hello" print(add_underscores(phrase)) 

Вывод должен выглядеть так:

i = 0; new_word = h_ i = 1; new_word = e_ i = 2; new_word = l_ i = 3; new_word = l_ i = 4; new_word = o_ o_ 

PD работает, но имеет несколько недостатков по сравнению с отладкой дебаггером. Вы должны запускать всю программу каждый раз, когда хотите проверить значения переменных, а также помнить про удаление вызовов функций print().

Один из способов улучшить наш цикл – перебирать символы в word:

def add_underscores(word): new_word = "_" for letter in word: new_word = new_word + letter + "_" return new_word 

Заключение

Теперь вы знаете все об отладке с помощью DLE. Вы можете использовать этот принцип с различными дебагерами.

В статье мы разобрали следующие темы:

  • использование окна управления отладкой;
  • установку точки останова для глубокого понимания работы кода;
  • применение кнопок Step, Go, Over и Out;
  • четырехэтапный процессом выявления и удаления ошибок.

Не останавливайтесь в обучении и практикуйте дебаггинг – это весело!

Источники

Источник

Оцените статью