P
prepair.app
Пройти интервью →
EnglishУкраїнськаРусскийDeutsch
🐍

Middle Python BackendВопросы на собеседовании Python разработчика

Middle · 2–4 года опыта

Собеседование Python-разработчика охватывает внутренности языка, асинхронность, Django или FastAPI и работу с базой. Ниже — самые частые вопросы с эталонными ответами. Middle: более глубокое понимание, оптимизацию и реальные рабочие ситуации.

Попробовать — без регистрации
Готовим вопрос…

Темы для подготовки

Типы данных и структуры
Декораторы и генераторы
GIL и конкурентность
asyncio и async/await
Django / FastAPI
ORM и оптимизация SQL

7 вопросов уровня Middle с ответами

1

Что на самом деле блокирует GIL и когда потоки всё же помогают?

Ответ

Global Interpreter Lock разрешает выполнять байткод Python только одному потоку одновременно, поэтому чистый Python-код никогда не идёт параллельно по ядрам. Потоки помогают там, где работа — это ожидание, а не вычисление: сеть, диск, база. Во время блокирующего ввода-вывода блокировка отпускается. Для счётной нагрузки нужны процессы, C-расширение, отпускающее GIL, или вынос горячей части из Python.

2

Что именно делает await и когда async бесполезен?

Ответ

await возвращает управление циклу событий, чтобы тот занялся чем-то ещё, пока операция не завершится; поток при этом не создаётся и параллельно ничего не выполняется. Async бесполезен на счётной нагрузке: долгое вычисление блокирует цикл, а вместе с ним и все остальные задачи. Бесполезен он и если в цепочке есть синхронная библиотека — один блокирующий драйвер базы останавливает весь цикл.

3

Напишите декоратор. Зачем ему functools.wraps?

Ответ

Декоратор — функция, которая принимает функцию и возвращает замену, обычно замыкание, вызывающее оригинал. Без functools.wraps замена несёт собственное имя и docstring, и декорированная функция представляется как wrapper — ломается интроспекция, help() и любой фреймворк, который маршрутизирует по имени функции. wraps переносит метаданные.

4

У вас N+1 в ORM. Как его найти и как исправить?

Ответ

Находится по журналу запросов или дебаг-панели: один запрос на каждую строку списка. Причина — ленивая загрузка внутри цикла. select_related решает для прямых внешних ключей через join, prefetch_related — для обратных и many-to-many вторым запросом со сборкой в памяти. Ловушка в том, чтобы вылечить симптом кешированием результата вместо самого запроса.

5

Когда вы вернёте генератор вместо списка?

Ответ

Когда вызывающий проходит по данным один раз и они не обязаны помещаться в память: чтение большого файла, потоковая выборка, конвейер преобразований. Цена в том, что генератор расходуется: у него нельзя взять длину, обратиться по индексу или пройти дважды без материализации. Возврат генератора из публичного API удивляет тех, кто ждёт последовательность, поэтому это решение стоит документировать.

6

Что гарантирует контекстный менеджер?

Ответ

Что __exit__ выполнится независимо от того, завершился блок нормально или упал — поэтому файловые дескрипторы, блокировки и транзакции живут именно там. В варианте через contextlib.contextmanager код до yield это подготовка, после — уборка, но только если она в finally, иначе исключение её пропустит. Гарантия касается очистки, а не подавления ошибки.

7

Что вы мокаете в тестах, а что нет?

Ответ

Мокают то, чем не владеют и не управляют: сторонние API, время, случайность, отправку почты. Не мокают собственную доменную логику — иначе тест проверяет, что мок ведёт себя так, как вы его написали. Мокать базу тоже обычно ошибка: транзакция с откатом после каждого теста даёт настоящее поведение почти бесплатно, а ошибки ORM — ровно те, которые моки скрывают.

🦎

Прочитать ответы недостаточно

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

Пройти интервью Middle Python Backend →
Бесплатно · 3 интервью в месяц

Другие уровни — Python Backend

Junior Python BackendSenior Python BackendВсе вопросы Python Backend

Другие специализации

🔍Middle QA Manual🤖Middle QA AutomationMiddle Java Backend🐘Middle PHP Backend🦫Middle Go Backend🟢Middle Node.js Backend💎Middle Ruby on Rails🟣Middle .NET Backend Developer🔷Middle C++🟨Middle JavaScript