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

5 способов отладки с iPython

Советы и хитрости о том, как использовать iPython в качестве вашего отладчика. Помечено с Python, iPython, отладки.

Существует отличная статья от TenderLove – одна из основных разработчиков Ruby and Rails – называется «Я ставит Debuggerer» , что мне понравилось, когда играл с Рубином. Гист этого – показать вам, что во многих случаях вам не нужен полноценный отладчик. Не добирайся мне (или принзел) неправильно – отладчик, который поставляется с хорошим IDE, является одним из самых мощных инструментов, которые могут иметь программист! Вы можете легко помещать точки останова в свой код, переместите вокруг трассировки стека или проверять и изменять переменные на лету. Он делает работу с большой кодовой базой гораздо проще и помогает новичкам встать на скорость на новом проекте.

Тем не менее, люди все еще используют Печать утверждения для отладки их кода. Я все время это делаю. Печать переменной быстрой и легкой. «Я собираюсь начать сеанс отладки» Звуки тяжелый Отказ «Я думаю, что есть ошибка с этой переменной. Я собираюсь распечатать это! “ нет. Не берите в голову, что через 5 минут наше Одно оператор печати превращается в:

print(a_varible)

...

if foo:
    print(">>>>>>>>>>>>>>Inside 3rd IF")

...

    print(">>>>>>>>>>>>>>Inside 37th IF")

print(">>>>>>>>>> #@!?#!!!")

Звучит знакомо? Нет ничего плохого в использовании Печать для отладки. Довольно часто это все, что вам нужно найти ошибку. И иногда это единственный способ, которым вы можете отладить свой код. Вы не можете легко Прикрепите отладчик к вашему производственному коду, не влияя на своих пользователей. Но добавив некоторые печатные заявления, а затем глядя на журналы, должны быть в порядке.

И не все используют IDE с хорошим отладчиком. Согласно Результаты опроса разработчика переполнения стека 2019 30,5% разработчиков используют Notepad ++, 25,4% VIM и 23,4% возвышенного текста. Это текстовые редакторы! И даже если я видел, как люди более продуктивны в VIM, чем большинство пользователей кода Pycharm или VS, текстовые редакторы не создаются с помощью мощного отладчика. Вы всегда можете использовать стандартный отладчик Python поплы , но гораздо лучшая альтернатива – использовать iPython в качестве вашего отладчика.

Я использовал VS-код в течение почти двух лет, но я не помню, когда в последний раз я использовал встроенный отладчик. Я делаю большую часть своей отладки в iPython. Вот как я использую это:

Встраивать сеанс iPython в коде

Наиболее распространенным корпусом для меня – встроить сеанс iPython в коде. Все, что вам нужно сделать, это поставить следующие строки в свой код:

from IPython import embed
embed()

Мне нравится ставить эти два утверждения в той же строке:

from IPython import embed; embed()

Таким образом, я могу удалить их одним нажатия клавиш. И, поскольку наличие нескольких заявлений на той же линии – это плохая практика в Python, каждый кодекс Линтер будет жаловаться на него. Таким образом, я не забуду удалить его, когда я закончу 😉.

Когда вы запускаете свой код, и интерпретатор попадает в строку с встроить () Функция, она откроет сеанс iPython. Вы можете ткнуть вокруг и посмотреть, что происходит в коде. Когда вы закончите, вы просто закроете сеанс ( Ctrl + D ) и выполнение кода будет продолжено. Одна хорошая вещь об этом подходе состоит в том, что все модификации, сделанные в iPython, будут сохраняться при закрытии его. Таким образом, вы можете изменить некоторые переменные или функции (вы даже можете украсить функции с некоторыми простыми журналами) и посмотреть, как остальная часть кода будет вести себя.

Вот короткое демонстрация встроить () в действии. Допустим, у нас есть следующий файл:

a = 10
b = 15

from IPython import embed; embed()

print(f"a+b = {a+b}")

Это то, что происходит, когда мы бежим:

Как видите, я изменил значение А Переменная и новое значение сохраняются после закрытия сеанса iPython.

Положить точку останова в вашем коде

Встраивать сеанс iPython в коде в порядке, если вы хотите увидеть, что происходит в данной строке. Но вы не можете выполнить следующие строки кода, как будет делать настоящий отладчик. Таким образом, лучшая идея состоит в том, чтобы положить точку останова в вашем коде вместо этого. Начиная с версии 3.7 Python, есть новая встроенная функция, называемая точка останова () что вы можете использовать для этого. Если вы используете более старую версию Python, вы можете добиться того же эффекта, запустив следующий код:

import pdb; pdb.set_trace()

Отладчик по умолчанию ( PDB ) довольно элементарный. Как и в стандартном Python REPL, вы не получите синтаксис выделения или автоматического отступа. Гораздо лучшая альтернатива – это IPDB. . Это будет использовать iPython в качестве отладчика. Чтобы включить его, используйте Я PDB вместо PDB:

import ipdb; ipdb.set_trace()

Есть еще один интересный отладчик, называемый PDB ++ Отказ Он имеет другой набор особенностей, чем IPDB, например, липкий Режим, который продолжает отображать вам текущее местоположение в коде.

Независимо от того, какой отладчик вы в конечном итоге используете, у них довольно стандартный набор команд. Вы можете выполнить следующую строку, позвонив на Следующий Команда (или просто n ), шаг внутри функции с шаг (или S ), продолжайте до следующей точки останова с Продолжить (или C ), Дисплей, где вы находитесь в коде с l или LL , и т.д. Если вы новичок для этих отладчиков CLI, «Отладка Python с PDB» Учебное пособие это хороший ресурс, чтобы узнать, как их использовать.

% Run -D filename.py

У Imython есть другой способ начать отладчик. Вам не нужно изменять исходный код любого файла, как мы сделали ранее. Если вы запустите % Run -D filename.py Magic Command, iPython будет выполнять filename.py Файл и положите точку останова на первой строке. Это как будто вы поставили Импорт IPDB; ipdb.set_trace () вручную внутри filename.py файл и запустить его с Python filename.py команда.

Если вы хотите поставить точку останова где-то еще, чем первая строка, вы можете использовать -b параметр. Следующий код поместит точку останова в строке 42:

%run -d -b42 filename.py

Имейте в виду, что указанная вами линия должна содержать код, который фактически делает что-то. Это не может быть пустой линией или комментарием!

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

%run -d -b myotherfile.py:42 myscript.py

Вышеуказанный код поместит точку останова в строке 42 в файл под названием myOtherfile.py а затем начните выполнять файл myscript.py Отказ Как только переводчик Python попадает в myOtherfile.py , он остановится на точке останова.

Постполюбивый отладки

IPython имеет 176 функций 1 Отказ Почта Мормование отладки – лучшие из них. По крайней мере для меня. Представьте, что вы управляете скриптом. Долговечный скрипт. И вдруг, через 15 минут, это вылетает. Отличный – Вы думаете – Теперь я должен положить некоторые точки останова, перезапустить его и подождать еще 15 минут, чтобы увидеть, что происходит. Ну, если вы используете iPython, то вам не нужно ждать. Все, что вам нужно сделать сейчас, это запустить магическую команду %отлаживать . Он будет загружать трассировку стека последнего исключения и запускать отладчик (Python хранит последнее необработанное исключение внутри sys.last_traceback Переменная). Это отличная особенность, которая уже сохранила мне часы Rerunning некоторые команды, чтобы начать отладчик.

Если вы используете стандарт PDB Отладчик, вы можете добиться того же поведения, запустив импортировать PDB; PDB.PM () команда.

Автоматический отладчик с% PDB

Единственный способ сделать отладку еще более удобным, для автоматического запуска отладчика, если исключение поднимается. И iPython имеет магическую команду, чтобы включить это поведение – % PDB Отказ

Если вы запустите % PDB 1 (или % PDB на ), отладчик автоматически начнет на каждом необработанном исключении. Вы можете отключить это поведение снова с % PDB 0 или % PDB OFF Отказ Бег % PDB Без какого-либо аргумента включите и выключить автоматический отладчик.

Фото Steinar Engeland на Бессмысленно

  1. Этот номер полностью состоит. Извините мои данные ученых друзей. ↩

Оригинал: “https://dev.to/switowski/5-ways-of-debugging-with-ipython-nfi”