Python 3.7: новые возможности отладки — краткий обзор

Python 3.7: новые возможности отладки — краткий обзор

Nuances of programming

Перевод статьи Anthony Shaw: Python 3.7’s new builtin breakpoint — a quick tour

Отладка в Python всегда была немного «неудобной» по сравнению с другими языками, с которыми я работал.

Большинство разработчиков обычно поступают так: импортируют модуль pdb из стандартной библиотеки и запускают pdb.set_trace(), который вводит интерактивную отладочную сессию в консоли.

При таком подходе возникают некоторые проблемы:

  1. Написание import pdb; pdb.set_trace() несколько сложно для понимания. После того, как вы наберете его раз сто, это переходит уже просто в мышечную память, но для новых разработчиков этот подход совсем не очевиден.
  2. PDB - не единственный отладчик, но он самый простой. Есть много вариантов и получше.
  3. Как быть, если вы пишете не просто консольное приложение? Например, что делать, если точка останова находится на сервере или у вас потоковая задача, где в этом случае задается сеанс отладки?

В Python 3.7 реализован PEP553, новый способ установки точек останова в коде.

Новый метод работы с точками останова

Итак, во-первых точка останова – это функция, а НЕ ключевое слово.

Поэтому просто установка breakpoint  на строку кода, на которой вы хотите остановить выполнение программы, ни к чему не приведет. Вы должны вызвать ее как метод, то есть так: breakpoint()

Реализация точки останова по умолчанию требует импортировать библиотеку import pdb, а вызов этой функции задается командой  pdb.set_trace().

name = "value"
breakpoint()

Допускается сеанс pdb в командной строке.

Таким образом, это уже намного интуитивно более понятно, чем в текущих версиях Python.

Постойте, вот еще

Новый метод точки останова можно отключить с помощью переменной среды PYTHONBREAKPOINT. Поэтому, если вы оставить точки останова в своем коде, выполнив отладку с ними только один раз, вполне можно потом полноценно выполнять программу, точки останова не будут мешать. Вы можете просто установить значение среды в нуль.

PYTHONBREAKPOINT=0 python3.7 debugger.py

Повторный вызов того же скрипта просто завершит выполнение, пропустив точки останова при выполнении.

Постойте, а вот и еще!

Переменной окружения PYTHONBREAKPOINT можно назначить имя вызова. Она может быть вызываемой, то есть с помощью ее вызова запускается сеанс отладки с помощью другой сторонней библиотеки отладчика.

pudb - одна из таких библиотек. Pudb - это интерактивный консольный отладчик с аналогичными ключевыми сочетаниями клавиш как в pdb, но с ним гораздо проще работать. pudbсуществует уже давно и полностью поддерживается в версиях Python 2 и Python 3.

Чтобы использовать pudb в качестве отладчика, сначала убедитесь, что вы его установили, установка осуществляется с помощью консольной команды pip install pudb, затем установите переменную окружения в pudb.set_trace.

Вызов в командной строке следующий :

PYTHONBREAKPOINT=pudb.set_trace python3.7 debugger.py

Он является эквивалентной заменой метода breakpoint() с помощью import pudb; pudb.set_trace()

Довольно круто.

А что насчет удаленной отладки и потоков?

Эта новая функция точки останова открывает интересный вариант использования.

Когда вы разрабатываете распределенное приложение для нескольких серверов или потоков, вы можете использовать локальный отладчик, например pudb.

При развертывании приложения в тестовой среде вы, скорее всего, не сможете его выполнить из cli. Тогда вы вызываете его из gevent или WSGI и т.п. Это возможно, когда вы изменяете переменную среды на своем веб-сервере или в тестовой среде или на другом отладчике, который допускает удаленные соединения.

Одним из таких пакетов, который вы можете использовать, является web-pdb. Web-pdb – это удаленный отладчик, который запускает веб-сервер при достижении точки останова и вы можете удаленно подключаться через браузер и интерактивно отлаживать сеанс.

Если вы установите web-pdb с помощью команды pip install web-pdb, вы можете сделать экспорт точек останова с помощью команды export PYTHONBREAKPOINT=’web_pdb.set_trace’, в этом случае, когда вызывается функция breakpoint() (независимо от того, находится ли она в фоновом режиме), вы можете подключиться к службе локально по умолчанию через порт 5555, и использовать этот интерфейс.

Статью перевел Владислав Семёнов.

Report Page