Мотивация

Вы когда-нибудь видели вывод ошибки, как показано ниже:

2 divided by 1 is equal to 2.0.
Traceback (most recent call last):
  File "loguru_example.py", line 17, in <module>
    divide_numbers(num_list)
  File "loguru_example.py", line 11, in divide_numbers
    res = division(num1, num2)
  File "loguru_example.py", line 5, in division
    return num1/num2
ZeroDivisionError: division by zero

и хотите, чтобы вывод был немного проще для понимания, как показано здесь?

Вы также можете визуализировать, какие строки кода выполняются и сколько раз они выполняются в реальном времени:

Если это так, эта статья предоставит вам инструменты, чтобы сделать именно то, что описано выше. Вот эти 3 инструмента:

  • Loguru - распечатайте лучшие исключения
  • snoop - распечатать строки кода, выполняемого в функции
  • Heartrate - визуализировать выполнение программы Python в режиме реального времени

И все, что нужно для использования этих инструментов, - это одна строчка кода!

Loguru - Печать лучших исключений

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

Чтобы установить Loguru, введите

pip install loguru

Чтобы понять, чем может быть полезен Loguru, представьте, что у вас есть 2 функции division и divide_numbers, и функция divide_numbers выполняется.

Обратите внимание, что combinations([2,1,0], 2) возвращает [(2, 1), (2, 0), (1, 0)]. После выполнения приведенного выше кода мы получаем эту ошибку:

2 divided by 1 is equal to 2.0.
Traceback (most recent call last):
  File "loguru_example.py", line 17, in <module>
    divide_numbers(num_list)
  File "loguru_example.py", line 11, in divide_numbers
    res = division(num1, num2)
  File "loguru_example.py", line 5, in division
    return num1/num2
ZeroDivisionError: division by zero

Из выходных данных мы знаем, что ошибка возникает в строке return num1/num2, но мы не знаем, какие значения num1 и num2 вызывают ошибку. К счастью, это можно легко отследить, добавив декоратор Loguru logger.catch:

Выход:

Добавление logger.catch упрощает понимание исключений! Оказывается, ошибка возникает при делении 2 на 0.

snoop - распечатать строки кода, выполняемые в функции

Что делать, если в коде нет ошибки, но мы хотим выяснить, что происходит в коде? Вот тут-то и пригодится snoop.

Snoop - это пакет Python, который печатает строки выполняемого кода вместе со значениями каждой переменной, добавляя только один декоратор.

Чтобы установить snoop, введите:

pip install snoop

Представим, что у нас есть функция с именемfactorial, которая находит факториал целого числа.

Выход:

The factorial of 5 is 120

Чтобы понять, почему результат factorial(5) равен 20, мы можем добавить декоратор snoop к функции factorial.

Выход:

В выходных данных выше мы можем увидеть значения переменных и то, какие строки кода выполняются. Теперь мы можем понять, как работает рекурсия!

Heartrate - Визуализируйте выполнение программы Python в реальном времени

Если вы хотите визуализировать, какие строки выполняются и сколько раз они выполняются, попробуйте сердечный ритм.

Heartrate тоже создан создателем snoop. Чтобы установить пульс, введите:

pip install heartrate

Теперь давайте добавим heartrate.trace(browser=True) к нашему предыдущему коду. Это откроет окно браузера, отображающее визуализацию файла, из которого был вызван trace().

Когда вы запустите приведенный выше код, должен появиться новый браузер. Если нет, перейдите по адресу http: // localhost: 9999. Вы должны увидеть результат, как показано ниже:

Прохладный! Полоски показывают линии, которые были поражены. Более длинные полосы означают больше совпадений, более светлые цвета - более свежие.

Из вывода выше мы видим, что программа выполняет:

  • if x==1 5 раз
  • return 1 один раз
  • return (x * factorial(x-1)) 4 раза

Вывод имеет смысл, поскольку начальное значение x равно 5, и функция вызывается повторно, пока x не станет равным 1.

Теперь давайте посмотрим, каково это - визуализировать выполнение программы Python в реальном времени с использованием пульса. Давайте добавим sleep(0.5), чтобы программа работала немного медленнее, и увеличим num до 20.

Потрясающие! Мы можем видеть, какие строки кода выполняются и сколько раз выполнялась каждая из них в режиме реального времени.

Заключение

Поздравляю! Вы только что узнали 3 инструмента для отслеживания и визуализации выполнения вашего кода Python. Я надеюсь, что при использовании этих трех инструментов отладка будет для вас менее болезненной. Поскольку для этих инструментов требуется всего одна строчка кода, почему бы не дать им попробовать увидеть, насколько они полезны?

Не стесняйтесь играть и создавать исходный код этой статьи здесь:



Мне нравится писать об основных концепциях науки о данных и играть с различными алгоритмами и инструментами анализа данных. Вы могли связаться со мной в LinkedIn и Twitter.

Пометьте это репо, если хотите проверить коды всех написанных мною статей. Следуйте за мной на Medium, чтобы быть в курсе моих последних статей по науке о данных, таких как: