
Доставка Python-приложения: wheel, контейнер или бинарник
Три способа довезти Python-код до сервера или пользователя. У каждого своя цена: размер, воспроизводимость, скорость старта и головная боль с зависимостями. Разбираем, когда что выбирать.

Три способа довезти Python-код до сервера или пользователя. У каждого своя цена: размер, воспроизводимость, скорость старта и головная боль с зависимостями. Разбираем, когда что выбирать.

Форматирование строки в logger.info, потеря контекста между модулями, дублирование записей и логирование секретов — четыре ошибки, из-за которых структурные логи в Python не работают так, как вы ожидаете.

Перед тем как переписывать горячий код на C, стоит понять, где реально узкое место и во что обойдётся сопровождение биндинга. Разбираем критерии выбора и цену каждого подхода.

Тест, который проходит десять раз подряд и падает на одиннадцатый, — не флейки, а незамороженные datetime, random без seed и живые HTTP-запросы. Разбираем, чем изолировать каждый источник недетерминизма.

Классические тесты проверяют примеры, которые вы придумали сами. Hypothesis генерирует сотни входов и находит баг на пустой строке, отрицательном числе и Unicode-символе, о которых вы не подумали.

Вы читаете миллион строк из базы циклом по одной записи и удивляетесь, почему скрипт работает третий час. Разбираем, как резать данные на пачки правильно и где batching ломается.

Покрытие полное, а баги всё равно проходят в прод. Мутационное тестирование ломает ваш код специально и проверяет, заметят ли это тесты. Разбираем на mutmut и cosmic-ray.

В CPython два механизма очистки памяти: подсчёт ссылок и поколенческий сборщик для циклов. Разбираем, когда именно запускается gc, как читать его пороги и в каких случаях его стоит трогать руками.

Запрос к платёжному API отвалился по таймауту, повтор через секунду прошёл. Разбираем, как оформить ретраи в Python: голый цикл, tenacity, встроенные механизмы клиентов и backoff — с ценой каждого варианта.

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

Внешний API вернул 429 и заблокировал ключ на час, потому что клиент отправлял запросы пачками. Разбираем, почему наивный счётчик не спасает и как токен-бакет сглаживает всплески.

Изменяемый объект по умолчанию — источник тихих багов: список из аргумента функции живёт между вызовами, а множество разъезжается по потокам. Разбираем, какими средствами Python 3.11+ добиться настоящей и защитной неизменяемости и чем за неё платишь.