Может быть, вы только начинаете Python - или, может быть, вы уже давно его используете и хотите узнать больше об отладке. Таким образом вы сможете более уверенно управлять крупными проектами, в которых, возможно, вы не совсем понимаете, что происходит. Это может включать просто желание узнать Python поближе. Может быть, вы пытаетесь избежать слишком большого переполнения стека?

Знание того, как отлаживать, может помочь вам справиться с множеством ситуаций, проанализировать поведение программы и действительно действительно расширяет возможности.

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

Итак, давайте рассмотрим несколько методов и инструментов отладки, которые я использую при программировании на Python. С небольшими оговорками: честно говоря, я бы считал себя программистом на Ruby, хотя я все еще использую Python среди многих других языков.

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

Пример программы (так что нам есть что отладить)

Ниже приведена простая программа, которую мы будем использовать в качестве своего рода проводника в процессе отладки, который мы собираемся продолжить:

Возможно, у вас не установлены запросы; и если вам нужно установить его, вы можете легко сделать это с помощью pip, если у вас установлен pip:

$ pip install requests

Чтобы запустить программу, мы передаем один аргумент, который должен быть IP-адресом, о котором мы хотим получить информацию от веб-службы, которая делает это:

$ python ip_info.py <ip_address>

Итак, давайте поговорим об отладке!

Печать Отладка

Иногда вы понятия не имеете, что происходит - и, возможно, у вас нет доступа в Интернет, вы недостаточно уверены, чтобы заставить pip работать, или просто что-то глупое. Бывает. Может это простая проблема.

В любом случае вам просто нужно отладить эту чертову штуку.

Возможно, вы запускаете наш пример скрипта и получаете сообщение об ошибке от python:

$ python ip_info.py

Вы давно не смотрели на этот сценарий. Вы просто запускаете его, думая, что он должен работать. Ладно, не тут-то было. Блин!

Ну вроде у нас импорт работает. Мы установили все наши модули с помощью pip, и мы уверены в этом. Давайте проанализируем, какую ошибку нам бросает Python:

Traceback (most recent call last):
  File "ip_info.py", line 6, in <module>
    ip = sys.argv[1]
IndexError: list index out of range

Я бы посмотрел на количество строк, имя файла - очевидно, - а затем на синтаксис этой конкретной строки кода, чтобы начать разбирать отдельные части, чтобы, возможно, выяснить, где что-то могло пойти не так, вместо того, чтобы иметь кучу функций, связанных вместе.

# Original program syntax from ip_info.py on line 6
sys.argv[1]
# Breaking that down.
sys
sys.argv
sys.argv[0]
sys.argv[1]

Итак, когда мы запускаем эту новую программу отладки без каких-либо аргументов:

$ python print_debugging.py

Обратите внимание, как 4 не печатает - это потому, что мы вызывали индекс, которого не было в argv, потому что при запуске скрипта не было передано никаких других аргументов. В противном случае у нас все будет хорошо, и 4 будет напечатано после того, как был наш аргумент. Например:

$ python print_debugging.py picat

Итак, теперь мы знаем - если мы еще этого не сделали, - что нам, вероятно, просто нужно было передать другой аргумент. Возможно, было бы разумно создать заявление об использовании или меню справки для этой программы, чтобы помочь пользователям (или нам самим, когда мы сделаем то же самое в следующем месяце). Разбор опций - тоже вещь.

Мы также не проверяем, действительно ли то, что дает пользователь, является IP-адресом. Или, по крайней мере, IP-адрес. В этом контексте надеюсь IP-адрес.

Возможно, вы также узнали, что первый элемент в argv, который является argv [0], представляет собой имя файла, или что argv представляет собой массив аргументов, передаваемых при запуске вашей программы на Python. Учимся, ура!

Интерактивные оболочки

Возможно, вы не хотели тратить время на набор print несколько раз или создание нового файла. Что совершенно разумно - а может быть, менее разумно для других? - кто знает. В любом случае, вы можете полностью использовать интерактивную оболочку python, чтобы получить представление о том, что происходит, набрав - или скопировав макароны - команды из файла в оболочку и наблюдая за выводом… в интерактивном режиме.

Интерактивная оболочка Python

Чтобы запустить интерактивную оболочку python, нам обычно достаточно ввести python в оболочку нашей системы. Я использую Баш. Кроме того, поскольку я использую mac для этих примеров, python 2.7 уже установлен в моей системе, что довольно удобно:

$ python
Python 2.7.12 (default, Jun 29 2016, 14:05:02)[GCC 4.2.1 Compatible Apple LLVM 7.3.0 (clang-703.0.31)] on darwinType "help", "copyright", "credits" or "license" for more information.
>>>

Теперь, при этом ››› я могу набирать текст на Python и получать результат в формате repl. Теперь мы можем начать взаимодействовать с этой оболочкой:

Еще раз обратите внимание, что мы пытаемся использовать индекс, который не существует - или находится за пределами допустимого диапазона - и мы также узнаем, что, когда мы вызываем оболочку python, обычно первый элемент в sys.argv на самом деле является пустой строкой.

if sys.argv[0]:
  print "argument is not empty :)" 
else:
  print "argument is empty :(" 

IPython

Если вы похожи на меня и вам действительно нравятся инструменты командной строки с подсветкой синтаксиса, самоанализом, поддержкой мультимедиа, завершением табуляции и записанной историей - тогда вы, вероятно, найдете I Python настоящим радость от использования. Чтобы установить iPython, если у вас его еще нет, используется другая команда pip:

$ pip install ipython

Теперь вместо использования «python» для получения интерактивной оболочки мы можем вместо этого набрать «ipython» и получить расширенную версию с кучей полезных свойств для работы с Python.

$ ipython
Python 2.7.12 (default, Jun 29 2016, 14:05:02)
Type "copyright", "credits" or "license" for more information.
IPython 5.1.0 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.
In [1]:

Как и в случае использования обычной интерактивной оболочки Python, мы можем наблюдать за выводом нашего кода Python и анализировать его поведение. Обратите внимание, что ipython - в отличие от обычного python - имеет «/ usr / local / bin / ipython» для sys.argv [0]

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

iPython также обладает некоторыми другими замечательными функциями, которые делают программирование на Python действительно потрясающим, например:

Отладка точки останова

Отладка по точкам останова - это то, что я считаю одной из самых мощных форм отладки из-за гибкости, которую вы получаете при анализе поведения программы.

pdb - Отладчик Python

Модуль pdb дает нам возможность иметь интерактивный отладчик исходного кода. Мы можем включить его, как любой другой модуль, в командную строку или с помощью оператора импорта; если мы хотим включить отладчик, который будет запускаться в первой строке нашей программы, мы можем включить его в командную строку с помощью флага -m:

$ python -m pdb ip_info.py

Как видите, у нас есть меню справки, доступное с помощью команды «h» в отладчике python:

Затем мы можем шагать (s), прыгать (j), проверять, где мы находимся (где) по мере прохождения и т. Д. Это действительно здорово. Итак, мы могли бы сделать что-то вроде этого:

Таким образом, мы могли полностью игнорировать захват второго элемента в массиве - и просто вручную установить IP-адрес, если мы не хотели заниматься всей отладкой программы и просто хотели, чтобы он работа, например. Глупый пример. Или мы можем лучше понять, как это работает, и сделать его лучше.

ipdb - PDB с поддержкой IPython

Однако, как и в случае с интерактивной оболочкой Python, мне бы очень понравились интересные вещи, которые IPython предлагает мне в отладчике точки останова. Что ж, к счастью, для этого есть решение: pdb с поддержкой IPython под названием ipdb, который дает нам все приятные вещи из IPython (завершение табуляции, прекрасные трассировки) прямо в pdb.

Итак, давайте продолжим и установим ipdb, чтобы получить все эти интересные функции:

$ pip install ipdb

Теперь мы могли бы сделать что-то подобное - или мы могли бы добиться того же с флагом -m при запуске python, как описано ранее:

Когда мы сейчас запускаем нашу программу на Python, нам предоставляется интерактивная оболочка:

Резюме

Для отладки программ Python доступны несколько действительно потрясающих инструментов. Некоторые из них имеют разные преимущества и недостатки; но все они позволяют вам лучше понимать язык и решать проблемы, с которыми вы можете столкнуться, большие и маленькие.

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