Краткий обзор 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.