Назад к материалам

Видео + статья / Собеседования

Собеседование Python Backend: SOLID, dict, генераторы и PostgreSQL

Правильные ответы на вопросы Python Backend: LSP и DIP, устройство dict, генераторы, исключения, mock и stub, конкурентность и SQL.

Опубликовано
Обновлено
Видео вышло
Видео
23:52
Текст
8 минут

Если ролик не загружается, выберите другую площадку.

Смотреть на

Это реальное собеседование на позицию Python Backend. Вопросы охватывают проектирование, устройство языка, тестирование, конкурентность и PostgreSQL. Мы не приводим личные данные участников: ниже — самостоятельный конспект с правильными ответами и оценкой результата.

Чем LSP отличается от DIP

Вопрос

Что означают принцип подстановки Лисков и принцип инверсии зависимостей?

Правильный ответ

LSP говорит о контракте: объект подтипа должен заменять объект базового типа без неожиданного нарушения поведения. Наследник не должен усиливать предусловия, ослаблять обещанный результат или ломать инварианты клиента.

DIP отвечает за направление зависимостей: высокоуровневая бизнес-логика и низкоуровневые детали зависят от абстракций. Это не просто «использовать наследование». Например, сервис заказа принимает интерфейс платежного шлюза, а конкретный HTTP-клиент подключается снаружи.

Коротко: LSP сохраняет контракт при подстановке типа, а DIP направляет зависимости высокоуровневого кода на абстракции.

Как работает dict в CPython

Вопрос

Как словарь находит ключ и обрабатывает коллизии?

Правильный ответ

dict — хеш-таблица. CPython вычисляет хеш ключа, находит позицию и при коллизии проверяет другие позиции по своей последовательности пробирования. Связанных списков для цепочек здесь нет. Доступ, вставка и удаление работают в среднем за O(1), но это не гарантия для худшего случая.

Ключ должен быть хешируемым. Если два объекта равны, их хеши обязаны совпадать; изменяемое состояние, влияющее на хеш, ломает поиск. Связь __eq__ и __hash__ закреплена в модели данных Python.

Коротко: dict в CPython — хеш-таблица с открытой адресацией; корректность ключа зависит от согласованности hash и равенства.

Чем итератор отличается от генератора

Вопрос

Является ли генератор отдельной структурой данных?

Правильный ответ

Итерируемый объект умеет вернуть итератор через __iter__(). Сам итератор выдаёт элементы через __next__() и завершает поток исключением StopIteration. Генератор — удобный способ создать итератор функцией с yield; он сохраняет состояние между шагами и вычисляет элементы лениво. Это соответствует описанию итераторов в Python.

Пример кодаPython
def even_numbers(limit: int):
    # yield возвращает одно значение и сохраняет позицию выполнения.
    for number in range(limit):
        if number % 2 == 0:
            yield number


# Элементы создаются по запросу, а не складываются в список заранее.
for value in even_numbers(6):
    print(value)

Коротко: итератор реализует протокол получения следующего элемента, а генератор создаёт такой итератор через yield.

В каком порядке писать except

Вопрос

Почему общий обработчик нельзя ставить первым?

Правильный ответ

Python выбирает первый совместимый except. Поэтому сначала ловят узкие типы, затем более общие. Большинство прикладных ошибок наследуется от Exception; BaseException также включает системные сигналы вроде KeyboardInterrupt и SystemExit, которые обычно нужно пропустить наружу. Иерархия есть в официальной документации.

Коротко: при обработке исключений частные типы ставят раньше общих, а BaseException почти никогда не ловят в бизнес-коде.

Чем Mock отличается от Stub

Вопрос

Какую роль играют тестовые двойники?

Правильный ответ

Stub возвращает заранее подготовленные данные и помогает проверить состояние результата. Mock обычно проверяет взаимодействие: был ли вызван метод, с какими аргументами и сколько раз. Граница не абсолютна: объект из unittest.mock может и возвращать значение, и записывать вызовы.

Сначала выбирают поведение теста, а затем термин. Чрезмерная проверка внутренних вызовов делает тест хрупким при безопасном рефакторинге.

Коротко: Stub выдаёт подготовленный результат, mock проверяет взаимодействие; unittest.mock способен выполнять обе роли.

Когда нужны asyncio, потоки и процессы

Вопрос

Как выбрать модель конкурентности в Python?

Правильный ответ

asyncio подходит для множества неблокирующих операций ввода-вывода: корутина добровольно отдаёт управление на await. Потоки полезны для блокирующих библиотек и также делят память процесса. В обычной сборке CPython GIL ограничивает параллельное выполнение Python-байткода в потоках, поэтому тяжёлые вычисления обычно выносят в процессы с отдельной памятью.

Выбор начинается с нагрузки, а не с названия инструмента: ожидание сети, блокирующий вызов или CPU-bound расчёт.

Коротко: asyncio и потоки удобны для ожидания ввода-вывода, а процессы — для тяжёлого Python-кода на нескольких ядрах.

Чем DELETE отличается от TRUNCATE

Вопрос

Как очистить таблицу и можно ли откатить операцию?

Правильный ответ

DELETE удаляет строки, подходящие под WHERE, может вернуть их через RETURNING и запускает обычные DELETE-триггеры. TRUNCATE быстро очищает таблицу целиком, берёт строгую блокировку и не запускает ON DELETE-триггеры.

Важная поправка к частому ответу: в PostgreSQL TRUNCATE транзакционно безопасен и откатывается, если транзакция не зафиксирована. Это прямо указано в документации PostgreSQL.

Коротко: DELETE удаляет выбранные строки, а TRUNCATE очищает таблицу целиком; в PostgreSQL обе операции транзакционны.

Получил ли кандидат оффер

Факт из записи: кандидат получил оффер. Он уверенно поддерживал диалог, признавал границы ответа и реагировал на подсказки. Наша оценка: база соответствует рабочему backend-профилю, но ответы про SOLID, коллизии и транзакционность TRUNCATE стоило сделать точнее.

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

Коротко: кандидат получил оффер благодаря рабочей базе и коммуникации, хотя несколько ответов требовали уточнения.

Источники

частые вопросы

Короткие ответы

Что повторить перед собеседованием Python Backend?

Повторите принципы SOLID, хеширование и dict, протокол итерации, исключения, тестовые двойники, модели конкурентности и базовые операции PostgreSQL.

Как отвечать на вопрос про внутренности Python?

Уточните реализацию, например CPython, объясните механизм и его практическое следствие. Не переносите внутреннее устройство одной реализации на весь язык.

Получил ли кандидат оффер?

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

следующий шаг

Проверьте ответы до реального Python-интервью

Тренажёр ЮНИКОД помогает повторить базу, найти пробелы и научиться объяснять решения без лишней воды.

Перейти в тренажёр →