Отладка – неотъемлемый этап процесса создания программы, цель которого – обнаружить и устранить проблемы, препятствующие правильной работе программного обеспечения.
Модуль 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 предоставляет интерактивную консоль, которая позволяет подробно изучить работу кода программы, отследить поведение и внести соответствующие изменения.
Читайте также: