Один бонусный трюк в конце

1. Автоматическая печать переменной f-строки

Итак, мы все знаем, что f-строки великолепны, потому что они позволяют нам форматировать текст, встроенный в переменные, которые мы хотим распечатать, например.

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

Недавно я узнал, что на самом деле вам не нужно вводить имя переменной, когда вы пишете свою f-строку. Следующий код выводит то же самое, что и выше («режим отладки»), но с меньшим объемом ввода:

Есть небольшая разница (просто кавычки), но для печати значений переменных это не имеет большого значения. Использование этого трюка на протяжении всей вашей жизни программиста может сэкономить вам целый час вашего времени, так что добро пожаловать.

2. Встроенное назначение

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

Пример:

обычно преобразуется в

Имеет смысл, мы, вероятно, вдвое сократили время работы.

Вот как это выглядит со встроенным присваиванием:

По сути, мы используем оператор :=, чтобы присвоить результат функции дорогому_результату, который используется функцией foo, а вторая строка также имеет «доступ» к дорогому_результату! Я признаю, что синтаксис выглядит немного запутанным, потому что обычно требуются круглые скобки, но это все равно полезно знать.

3. pdb.set_trace()

До знакомства с pdb мой набор инструментов для отладки состоял из печати переменных, использования отладчиков IDE и общения с резиновой уткой. К этому добавляется встроенная библиотека pdb. Несмотря на то, что в нем есть множество утилит, которые я еще не изучил, главной особенностью для меня является функция set_trace().

Вы используете его так:

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

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

4. Бонус: профилировщик линий

Последний трюк — это сторонняя библиотека, но она достаточно полезна, чтобы о ней писали.

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

Например, рассмотрим следующий пример кода:

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

Во-первых, мы добавляем декоратор @profile к интересующей нас функции:

IDE недовольна, но теперь мы просто устанавливаем line_profiler:

pip install line_profiler

и запустите его (опция l предназначена для построчного выполнения, v — для немедленного просмотра результатов):

kernprof -lv main.py

и мы видим вывод:

Как видите, теперь мы знаем, что long_function — это главный пожиратель времени в нашей программе.

Это все приемы, которые у меня есть на данный момент — я научился всему этому за последний месяц и всегда ищу способы научиться. Дайте мне знать, если я допустил какие-либо ошибки или есть ли еще какие-либо приемы, которые вы бы добавили в этот список.