Вернуться в видеотекуМок-интервью Python-разработчика: копирование, транзакции и async
Публичное мок-собеседование по Python: кандидат анализирует фрагменты кода, объясняет их поведение и реализует учебный контекстный менеджер транзакции. Вопросы охватывают shallow copy и общие изменяемые объекты, аргументы по умолчанию, retry-декораторы, исключения, кэширование coroutine, asyncio, гонки при ленивой загрузке и отмену задач.
- Направление
- Backend
- Формат
- Мок-собеседование
- Грейд
- Senior
- Длительность
- 1:03:22
Коротко о видео
Публичное Python-мок-собеседование построено как последовательность задач на чтение и правку кода. Кандидат разбирает ссылки после shallow copy и dict.fromkeys, эффект аргументов по умолчанию, пишет параметризованный retry-декоратор и выясняет разницу между синхронным и async wrapper. Далее рассматриваются bare raise, кэширование coroutine через lru_cache, потеря хвоста при zip, безопасная реализация __eq__, контекстный менеджер transaction с commit/rollback, гонка в ленивом async-кэше и поведение asyncio.shield при timeout. Интервьюер даёт наводящие вопросы и краткий фидбэк; после технической части идёт презентация программы.
Затронутые темы
Что взять на заметку
- Поверхностное копирование отделяет только верхний уровень, а dict.fromkeys с изменяемым значением даёт всем ключам одну и ту же ссылку.
- Значение аргумента по умолчанию вычисляется при определении функции; для времени создания объекта обычно используют None и вычисляют datetime.now() внутри.
- Обёртка декоратора для async-функции должна await-ить результат; нельзя повторно await-ить один и тот же уже завершённый объект coroutine, закэшированный через lru_cache.
- Голый raise допустим только внутри активного except; иначе Python возбуждает RuntimeError.
- Контекстный менеджер транзакции должен выполнять rollback при исключении и commit только при нормальном выходе из блока.
- asyncio.shield сохраняет внутреннюю задачу при отмене внешнего ожидания, но timeout или отмена всё равно приходят вызывающему коду.
- Чтобы loader не запускался дважды для одного ключа, используют синхронизацию по ключу или общую задачу загрузки; единый lock без необходимости сериализует разные ключи.