Отладка программ Python с помощью интерактивной консоли

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

Модуль code – быстрый и производительный инструмент отладки Python. Его можно использовать для эмуляции интерактивного интерпретатора. Также модуль позволяет поэкспериментировать с кодом программы Python.

Краткий обзор модуля code

Вместо того чтобы перебирать код с помощью отладчика, вы можете добавить в программу Python модуль code, который прекратит выполнение программы и переведёт её в интерактивный режим, чтобы проверить работу кода. Модуль code входит в стандартную библиотеку Python.

Это позволяет использовать интерпретатор, не жертвуя сложностью и прочностью файлов программы. Модуль code может исключить из кода операторы print(), которые используются для отладки (со временем код будет перегружен этими операторами, его будет сложно читать и поддерживать).

Использовать модуль как метод отладки можно с помощью функции interact(), которая останавливает программу и предоставляет интерактивную консоль для отслеживания и отладки текущего состояния программы.

Функция с параметрами выглядит следующим образом:

code.interact(banner=None, readfunc=None, local=None, exitmsg=None)

Такая функция запустит цикл «чтение – вычисление – вывод» и создаст объект класса InteractiveConsole, который эмулирует поведение интерактивного интерпретатора Python.

Параметры функции:

  • Опция banner позволяет добавить строку, которая известит о запуске интерпретатора.
  • readfunc можно использовать как метод InteractiveConsole.raw_input().
  • local устанавливает пространство имен по умолчанию для цикла интерпретатора.
  • exitmsg может содержать строку, указывающую, где заканчивается интерпретатор.

Параметр local можно использовать следующим образом:

  • local=locals() – локальное пространство имён
  • local=globals() – глобальное пространство имён
  • local=dict(globals(), **locals()) – глобальное и текущее локальное пространство имён.

Обратите внимание: exitmsg – новый параметр Python 3.6; если вы пользуетесь более старой версией Python, обновите версию или пропустите параметр exitmsg.

Функцию interact() можно вставить в любое место в коде программы.

Использование модуля code

Рассмотрим работу модуля на примере программы банковских счетов balances.py. Параметр local будет иметь значение locals().

# Импорт модуля code
import code
bal_a = 2324
bal_b = 0
bal_c = 409
bal_d = -2
account_balances = [bal_a, bal_b, bal_c, bal_d] def display_bal():
for balance in account_balances:
if balance < 0:
print("Account balance of {} is below 0; add funds now."
.format(balance))
elif balance == 0:
print("Account balance of {} is equal to 0; add funds soon."
.format(balance))
else:
print("Account balance of {} is above 0.".format(balance))
# Функция interact() запускает интерпретатор с локальным пространством имен
code.interact(local=locals())
display_bal()

В программе используется функция code.interact () с параметром local = locals (), который включает локальное пространство имен как значение по умолчанию в цикле интерпретатора.

Запустите программу с помощью команды python, если вы находитесь в виртуальной среде (если нет, тогда используйте команду python3).

python balances.py

Команда выведет:

Python 3.6.1 (default, Apr  4 2017, 09:40:51)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>

Курсор будет помещен в конец строки >>> (как это было бы в интерактивной оболочке Python).

Здесь вы можете вызывать переменные, функции и т. п.:

>>> print(bal_c)
409
>>> print(account_balances)
[2324, 0, 409, -2] >>> print(display_bal())
Account balance of 2324 is 0 or above.
Account balance of 0 is equal to 0, add funds soon.
Account balance of 409 is 0 or above.
Account balance of -2 is below 0, add funds now.
None
>>> print(display_bal)
<function display_bal at 0x104b80f28>
>>>

В локальном пространстве имён можно выводить переменные и вызывать функции. Последний вызов print() показывает расположение функции display_bal в памяти компьютера.

Завершив работу с интерпретатором, нажмите CTRL + D в *nix-подобных системах или CTRL + Z в Windows-подобных системах, чтобы закрыть консоль и возобновить работу программы.

Чтобы покинуть консоль, не выполняя оставшуюся часть программы, наберите quit(), и программа будет прервана.

Использовать параметры banner и exitmsg можно так:

...
# Функция interact() запускает интерпретатор
code.interact(banner="Start", local=locals(), exitmsg="End")
display_bal()

Запустите программу. На экране появится:

Start
>>>

Параметр banner позволяет добавить в код несколько точек запуска интерпретатора и различать их. К примеру, вы можете использовать параметр banner со значением «In for-loop» и параметр exitmsg со значением «Out of for-loop».

Далее вы просто работаете с интерпретатором. Закрыв интерпретатор, вы получите сообщения:

Account balance of 2324 is 0 or above.
Account balance of 0 is equal to 0, add funds soon.
Account balance of 409 is 0 or above.
Account balance of -2 is below 0, add funds now.

Выполнив отладку кода программы, удалите функции code и операторы import, и программа будет работать как обычно.

Заключение

Модуль code предоставляет интерактивную консоль, которая позволяет подробно изучить работу кода программы, отследить поведение и внести соответствующие изменения.

Читайте также:

Tags:

Добавить комментарий