Отладка является частью процесса разработки программного обеспечения, где программисты ищут, а затем решают проблемы, которые мешают программному обеспечению от правильного запуска.
Полезный и быстрый инструмент для отладки является модуль code
в Python, так как он может быть использован для эмуляции интерактивного интерпретатора. Модуль также предоставляет возможность экспериментировать с кодом , который вы пишете в Python.
code
Вместо того, чтобы пройти через код с помощью отладчика, вы можете добавить модульcode
в программу Python, чтобы настроить программу , остановить выполнение и ввести в интерактивный режим для того, чтобы изучить, как работает ваш код. Модуль code
является частью стандартной библиотеки Python.
Это полезно, потому что вы можете использовать интерпретатор без ущерба сложности и неизменности, которое программирование могут обеспечить. Благодаря помощи модуля code
вы можете избежать использования заявления print()
на протяжении всей отладки кода, которая может стать громоздкой с течением времени.
Для того, чтобы использовать модуль в качестве метода для отладки, вы можете использовать функцию interact()
модуля, который останавливает выполнение программы в точке, в которой она указывается, и предоставляет вам интерактивную консоль, так что вы можете проверить состояние вашей программы.
Функция с ее возможными параметрами являются следующие:
code.interact(banner=None, readfunc=None, local=None, exitmsg=None)
Эта функция запускает цикл read-eval-print и создает экземпляр объекта класса 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()
чтобы установить пространство имен для локальных.
balances.py
# Import code module 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)) # Use interact() function to start the interpreter with local namespace code.interact(local=locals()) display_bal()
Мы использовали функцию code.interact()
с параметром local=locals() использовать локальное пространство имен по умолчанию внутри цикла интерпретатора.
Давайте запустим программу выше, используя команду python3
, если мы не в виртуальной среде, или иначе команду python
:
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
, мы можем выполнить следующее:
... # Use interact() function to start the interpreter code.interact(banner="Start", local=locals(), exitmsg="End") display_bal()
Когда мы запускаем программу, мы получим следующий результат:
Start >>>
Используя параметр banner
позволяет вам установить несколько точек в пределах вашего кода и даст вам возможность идентифицировать их. Например, вы можете использовать banner
для печати "In for-loop"
с exitmsg
для печати "Out of for-loop"
, так что вы можете точно сказать, где вы находитесь в коде.
Отсюда, мы можем использовать интерпретатор, как обычно. После этого, когда мы наберем CTRL + D
для выхода из интерпретатора, мы получим сообщение выхода и функция будет работать в обычном режиме:
End 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
для отладки кода, вы должны удалить функцию code
и оператор импорта так, чтобы ваша программа могла работать в обычном режиме. Модуль code
предоставляет утилиту, так что как только вы все выполнили, необходимо ее убирать.
Использование модуля code
для запуска интерактивной консоли может позволить вам взглянуть на то, как работает код на детальном уровне, чтобы понять его поведение и вносить изменения по мере необходимости. Чтобы узнать больше об этом, вы можете прочитать официальную документацию модуля code
.