Настройка среды 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.
ИМХО: По мере роста потребностей взгляните на 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_» .
Запустим. Выполнение останавливается на строке с определением функции.
Нажмите кнопку Go, чтобы выполнить код до точки останова:
Код останавливается перед циклом for в функции add_underscores(). Обратите внимание, что на панели Locals отображаются две локальные переменные – word со значением «hello», и new_word со значением «_»,
Нажмите кнопку Step, чтобы войти в цикл for. Окно отладки изменится, и новая переменная i со значением 0 отобразится на панели Locals:
Переменная i – это счетчик для цикла for, который можно использовать, чтобы отслеживать активную на данный момент итерацию.
Нажмите кнопку Step еще раз и посмотрите на панель Locals – переменная new_word приняла значение «h_»:
Это неправильно т. к. сначала в 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;
- четырехэтапный процессом выявления и удаления ошибок.
Не останавливайтесь в обучении и практикуйте дебаггинг – это весело!