
pyproject.toml вместо setup.py: собираем пакет по-новому
setup.py больше не нужен для сборки: PEP 517/518 сделали pyproject.toml единым файлом конфигурации. Разбираем, что туда писать и чем платишь за переход на build-бэкенды.

setup.py больше не нужен для сборки: PEP 517/518 сделали pyproject.toml единым файлом конфигурации. Разбираем, что туда писать и чем платишь за переход на build-бэкенды.

Плоский проект с одним файлом рано или поздно превращается в кашу из циклических импортов и запусков через python script.py из корня. Разбираем, как раскладывать пакеты, где держать точку входа и почему src-layout спасает от импортов-призраков.

В SQLAlchemy 2.0 исчез Query.get, изменился select(), а сессии стали строже к неявным запросам. Разбираем, какие вызовы придётся переписать и как перевести проект без переписывания с нуля.

Три способа ходить в PostgreSQL из Python дают разный контроль над SQL и разную цену за удобство. Разбираем, где каждый выигрывает и чем платит.

GIL не даёт потокам считать параллельно, а процессы дают — но с ценой на сериализацию и запуск. Разбираем, какой инструмент из multiprocessing брать под задачу и где он ломается.

Вы распараллелили расчёт на четыре потока, а он стал работать не быстрее, а иногда медленнее. Разбираем, как GIL в CPython решает, кто исполняет байт-код, и когда потоки реально помогают.

Скрипт с requests опрашивает 200 URL за 90 секунд, переписанный на aiohttp — за 4. А иногда наоборот: asyncio добавляет накладных расходов и не даёт ничего. Разбираем, где проходит граница.

Корутина — не поток и не магия. Разбираем, во что превращается async def, как event loop дёргает ваши функции через send() и почему один блокирующий вызов вешает весь сервис.

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

Три структуры из модуля collections закрывают задачи, где обычный dict и list заставляют писать лишний код и теряют в скорости. Разбираем, что каждая даёт и чем за это платишь.

Группировка, скользящее окно, разбивка на пачки и декартово произведение — задачи, которые обычно решают вложенными циклами, укладываются в один вызов из itertools. Разбираем рабочие приёмы для Python 3.12.

Три инструмента из functools экономят строки кода, но каждый бьёт по рукам в неожиданном месте: lru_cache течёт памятью, partial ломает интроспекцию, wraps молча теряет часть метаданных. Разбираем на конкретных задачах.