Краткий обзор 4 функций, предоставляемых библиотекой gamla, которые помогают находить ошибки и проблемы с производительностью в вашем коде.

gamla — это библиотека функционального программирования для Python.

Сегодня мы рассмотрим 4 функции, которые он предоставляет, которые помогают находить ошибки и проблемы с производительностью в вашем коде.

Мы рассмотрим debug, debug_exception, timeit и profileit.

Первые два основаны на команде nativebreakpoint.

Python имеет встроенный отладчик командной строки под названием pdb. Его можно вызвать, набрав breakpoint() в любом месте.

При запуске кода выполнение будет приостановлено в этом месте, и появится командная строка pdb.

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

debug

Давайте представим, что вы запускаете следующий фрагмент кода:

Запуск этого вызывает исключение:

TypeError: unsupported operand type(s) for ** or pow(): ‘str’ and ‘int’

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

Но это немного утомительно. Нам бы хотелось каким-то образом встроить точку останова. Вот тут и появляется debug.

Его реализацию можно представить примерно так:

Это позволяет нам встроить точку останова следующим образом:

Это означает, что нам не нужно реорганизовывать наш код, когда мы просто хотим что-то посмотреть.

Это особенно полезно, если вы программируете в конвейерах:

отладка_после

Иногда у нас уже есть функция, выполняющая работу, и мы просто хотим посмотреть, что она возвращает. В данном случае удобнее debug_after, потому что его можно просто написать вне функции и не надо возиться с правильным оформлением скобок вокруг значения.

Естественно, есть еще и debug_before.

отладочное_исключение

Так что это хорошо, но что, если у нас огромный список? Нам пришлось бы перебирать множество значений, пока мы не достигнем того, который показывает проблему.

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

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

In [1]: @debug_exception  # Will break only once!
   ...: def key_fn(x):
   ...:       return x**2
   ...:
In [2]: my_list = [1, 2, 'c', 4]
In [3]: sorted_list = sorted(my_list, key=key_fn)
> debug_utils.py(90)debug_exception()
-> raise e
(Pdb) x
('c',)
(Pdb) c
...

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

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

время

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

Это также работает для async:

профиль

Эта утилита использует yappi под капотом для вывода самых медленных внутренних вызовов синхронной или асинхронной функции.

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

Обработка инструментов отладки как кода означает, что вы можете создать набор инструментов для себя в соответствии с вашими потребностями, например. debug_compose, который будет приостанавливаться после каждого шага конвейера или использовать его с другими полезными концепциями, например. when(greater_than(3), debug), который позволит вам просматривать значения, но только если они удовлетворяют некоторому условию.

Надеюсь, это будет полезно для вас, и если вы найдете полезные шаблоны, обязательно отправьте нам PR.

Дополнительные материалы на PlainEnglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter и LinkedIn. Присоединяйтесь к нашему сообществу Discord.