На Junior Python-собеседовании быстро переходят от базового синтаксиса к причинам, по которым язык и инструменты работают именно так. Кандидату нужно не только назвать термин, но и выдержать уточнение: что происходит внутри, где это применяют и какое есть ограничение. Разбираем реальные вопросы без личных данных участников.
Чем аутентификация отличается от авторизации и как защищать refresh token?
Аутентификация подтверждает личность, авторизация проверяет право на действие. Регистрация лишь создаёт учётную запись. Access token обычно живёт недолго и прикладывается к запросам, refresh token используется для получения новой пары токенов.
Refresh token защищают не одной подписью. Нужны безопасное хранение, ротация при использовании, отзыв цепочки при повторном предъявлении старого токена и ограниченный срок жизни. Для JWT сервер проверяет алгоритм, подпись, издателя, аудиторию и время действия; рекомендации по безопасной проверке собраны в RFC 8725.
Какие принципы ООП есть в Python и можно ли получить доступ к private-методу?
Обычно называют абстракцию, инкапсуляцию, наследование и полиморфизм. В Python это не жёсткие стены, а языковые механизмы и соглашения. Имя _value сообщает, что атрибут внутренний. Имя __value запускает name mangling и превращается примерно в _ClassName__value, но не делает доступ невозможным.
При множественном наследовании порядок поиска методов задаёт MRO. Его можно увидеть через Class.mro(). Модуль — отдельный Python-файл, пакет организует модули в импортируемое пространство, а библиотека — общий термин для готового набора кода.
Python прежде всего позволяет писать императивные программы, но поддерживает объектный, функциональный и декларативный стиль. Ответ «только императивный» слишком узкий.
Что делает git rebase и чем он отличается от merge?
merge объединяет две истории, а rebase заново применяет коммиты поверх другого основания. Снимок проекта в итоге может совпасть, но история будет другой. Официальная книга Git подробно показывает, как изменения переигрываются на новой базе.

Коммит C4 применён поверх C3 и получил новый идентификатор C4'. Источник: Pro Git — Rebasing.
Из-за новых идентификаторов не стоит без договорённости перебазировать опубликованную ветку, которой уже пользуются другие. cherry-pick решает другую задачу: копирует выбранные коммиты в текущую ветку.
Как обрабатывать исключения и зачем нужен functools.wraps?
Исключения обрабатывают через try, except, необязательный else и finally. Обработчики проверяются сверху вниз, поэтому сначала ставят узкие типы исключений, затем общие. Голый except скрывает даже ошибки завершения и почти всегда слишком широк.
Декоратор принимает вызываемый объект и возвращает объект с изменённым поведением. Без functools.wraps обёртка теряет имя и документацию исходной функции. Короткий пример показывает оба механизма:
from functools import wraps
def log_call(function):
# wraps сохраняет имя и описание исходной функции.
@wraps(function)
def wrapper(*args, **kwargs):
print(f"Запускаем {function.__name__}")
return function(*args, **kwargs)
return wrapper
@log_call
def divide(left: float, right: float) -> float:
# Конкретная ошибка сообщает вызывающему коду точную причину сбоя.
if right == 0:
raise ValueError("Делитель не может быть равен нулю")
return left / right
print(divide(10, 2)) # Ожидаемый результат — 5.0.Чем Task отличается от Future и как связан GIL?
Future хранит будущий результат асинхронной операции, а Task планирует выполнение корутины и является специализированным Future. В прикладном коде задачу обычно создают через asyncio.create_task, а event loop переключает корутины в точках ожидания.
Асинхронность удобна для множества сетевых ожиданий. Потоки тоже полезны для ввода-вывода и блокирующих библиотек. GIL в обычной сборке CPython ограничивает одновременное выполнение Python-байткода потоками, но не означает, что потоки бесполезны. Для тяжёлых вычислений часто выбирают процессы или нативный код, освобождающий GIL.
Утечки памяти ищут измерениями: tracemalloc сравнивает снимки выделений, профилировщик показывает рост объектов, а нагрузочный тест помогает воспроизвести проблему. Сборщик мусора сам по себе не объясняет, кто удерживает ссылку.
Как работают хэшируемость и коллизии словаря?
Ключ словаря должен иметь стабильный хэш и согласованное равенство. Если a == b, их хэши обязаны совпадать. Изменяемый список не подходит, потому что его содержимое меняется. Кортеж подходит только тогда, когда хэшируемы все его элементы.
Пользовательский класс по умолчанию часто хэшируется по идентичности объекта. Если определить __eq__, Python может отключить __hash__, чтобы не допустить противоречия. Точные правила описаны в модели данных Python.
Коллизия означает, что разные ключи попали в одну область таблицы. Это нормальная ситуация: словарь сравнивает хэш и сам ключ, а затем продолжает поиск. Обещать уникальность хэша нельзя.
Что такое REST и чистая архитектура?
REST — набор ограничений для сетевой архитектуры, а не синоним JSON API. Ключевые свойства — клиент-серверное разделение, отсутствие серверной сессии между запросами, кэшируемость, единообразный интерфейс, слои и необязательный код по требованию. HTTP-метод должен соответствовать смыслу операции, а статус — её результату.
Чистая архитектура отделяет бизнес-правила от базы, веб-фреймворка и интерфейса. Зависимости направлены внутрь: внешний слой знает о сценарии использования, но сценарий не обязан знать о FastAPI или PostgreSQL. На Junior-уровне достаточно объяснить принцип и привести один пример замены базы через интерфейс репозитория.
Итог: получил бы кандидат оффер?
Фактический результат не раскрыт. По этой части интервью данных недостаточно для уверенного оффера. Кандидат знал базовые определения, но в авторизации, асинхронности, GIL и хэш-таблицах встречались неточности. При этом он поддерживал диалог и мог развить часть ответов после уточнения.
Для Junior-позиции результат мог зависеть от практической задачи и требований команды. Мы бы сначала повторили пять слабых тем, затем прошли их вслух в тренажёре собеседований ЮНИКОД и проверили, выдерживает ли каждый ответ уточняющий вопрос.
Источники
частые вопросы
Короткие ответы
Какие темы Python обязательны для Junior?
Типы данных, функции, исключения, ООП, итераторы, декораторы, основы asyncio, HTTP, Git и работа словарей. Важно уметь показать каждую тему коротким примером.
Нужно ли Junior Python знать внутреннее устройство dict?
Нужно понимать хэшируемость, равенство, коллизии и требование стабильности ключа. Детали реализации конкретной версии CPython обычно вторичны.
Как тренировать ответы без заучивания?
Отвечайте по схеме «определение — механизм — пример — ограничение», затем меняйте условие и проверяйте, сможете ли перестроить ответ.


