Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 661новая вакансия за сутки·92 296вакансий открыто сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании7 192
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 401 кандидат открыт к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python17 143
  • Облачные технологии14 064
  • QA вакансии3 446
  • Backend вакансии2 095
  • Инженер данных1 792
  • Продакт-менеджер1 233

Разработка

  • Android1 857
  • iOS1 697
  • Fullstack вакансии981
  • AI вакансии949
  • Frontend вакансии742
  • Mobile вакансии44

По стеку

  • Go8 689
  • Java6 529
  • Node.js2 023
  • .NET1 723
  • Kotlin1 596
  • Rust1 462
  • C#710
  • PHP683
  • C++574

DevOps и инфраструктура

  • Kubernetes7 762
  • DevOps вакансии6 052
  • Linux-инфраструктура5 491
  • Terraform / IaC4 268
  • CI/CD3 244
  • Мониторинг и Observability1 789
  • SRE567
  • Кибербезопасность455

Аналитика и данные

  • Data Scientist1 124
  • Бизнес-аналитик917
  • Аналитик данных839
  • Системный аналитик151

Другие направления

  • Проджект-менеджер606
  • UI/UX дизайн142
  • Ручное тестирование14

По регионам

  • Вакансии в США43 473
  • Вакансии в Европе23 552
  • Вакансии в Канаде4 444
  • Работа в России3 901

По формату

  • Удалённые вакансии73 579
  • Релокация в США43 516
  • Гибридная работа12 395
  • Офисная работа7 085

По уровню

  • Senior вакансии42 222
  • Middle вакансии20 589
  • Junior вакансии6 639

Сейчас нанимают

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab137 вакансий
  • Celonis39 вакансий
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace16 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме PythonВсе вопросы
PythonMiddleТеория

Как with гарантирует освобождение ресурсов при исключении?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

Блок with гарантирует вызов __exit__ даже при исключении через механизм try/finally. __exit__ получает тип, значение и трейсбек исключения и может его подавить, вернув True.

Внутренняя механика

# Компилятор разворачивает:
# with open("file.txt") as f:
#     data = f.read()

# В примерно такой код:
_mgr = open("file.txt")
f = _mgr.__enter__()
_exc = None
try:
    data = f.read()      # тело блока
except BaseException as e:
    _exc = e
    # __exit__ получает сведения об исключении
    if _mgr.__exit__(type(e), e, e.__traceback__):
        pass  # исключение подавлено (возврат True)
    else:
        raise  # исключение перебрасывается
else:
    _mgr.__exit__(None, None, None)  # нормальный выход

Как with гарантирует освобождение ресурсов при исключении

Оператор with реализован через скрытый блок try/finally. Метод __exit__ контекстного менеджера вызывается всегда — независимо от того, завершился ли блок нормально или выбросил исключение.

Пример: менеджер с логированием исключений

import logging
from types import TracebackType
from typing import Type


class ManagedResource:
    def __init__(self, name: str) -> None:
        self.name = name
        self._handle: object = None

    def __enter__(self) -> "ManagedResource":
        logging.info("Opening %s", self.name)
        self._handle = object()  # имитация открытия ресурса
        return self

    def __exit__(
        self,
        exc_type: Type[BaseException] | None,
        exc_val: BaseException | None,
        exc_tb: TracebackType | None,
    ) -> bool:
        logging.info("Closing %s", self.name)
        self._handle = None  # всегда освобождаем ресурс

        if exc_type is ValueError:
            logging.warning("Suppressing ValueError: %s", exc_val)
            return True  # подавляем ValueError
        return False  # все прочие исключения пробрасываем дальше


with ManagedResource("db-connection") as res:
    raise ValueError("bad input")  # будет подавлено
print("Продолжаем выполнение")    # выведется

try:
    with ManagedResource("db-connection") as res:
        raise RuntimeError("fatal")  # НЕ подавляется
except RuntimeError:
    print("RuntimeError не подавлен, но ресурс закрыт")

contextmanager и обработка исключений

from contextlib import contextmanager
import psycopg2


@contextmanager
def transaction(conn: psycopg2.extensions.connection):
    try:
        yield conn
        conn.commit()              # только при успехе
    except Exception:
        conn.rollback()            # откатываем при любой ошибке
        raise                      # пробрасываем исключение дальше
    finally:
        # finally выполняется всегда — идеально для закрытия
        pass  # conn.close() если нужно

ExitStack для динамического числа ресурсов

from contextlib import ExitStack

files = ["a.txt", "b.txt", "c.txt"]

with ExitStack() as stack:
    handles = [stack.enter_context(open(f)) for f in files]
    # Все файлы закроются при выходе, даже при исключении
    data = [h.read() for h in handles]

Подводные камни

  • Если __enter__ выбросит исключение, __exit__ не будет вызван — ресурс, захваченный до исключения, останется незакрытым.
  • Возврат True из __exit__ подавляет исключение молча — логируйте это явно, иначе ошибки теряются.
  • В @contextmanager если забыть raise в блоке except, исключение подавляется — поведение отличается от обычного класса менеджера.
  • При вложенных with каждый менеджер получает только исключение, возникшее в его области — внешний менеджер не видит исключений из внутреннего, если они подавлены.
  • BaseException (включая KeyboardInterrupt, SystemExit) тоже передаётся в __exit__ — не заглушайте его случайно.
  • В async-коде нужен async with и __aenter__/__aexit__; синхронный протокол там не работает.

Частые вопросы на собеседовании

  • Что такое truthy и falsy значения в Python?
  • Когда использовать threading?
  • Что такое type hints и зачем они нужны?
  • Как работает yield?

Типичные ошибки

  • Считать with аналогом только finally без обработки исключений.
  • Не знать параметры exit.
  • Не упоминать ограничение при падении enter.

Что проверяет интервьюер

  • Объясняет вызов exit при исключении.
  • Понимает suppress semantics.
  • Знает границы гарантии.

Как вы знаете этот вопрос?

Проверить себя по теме Python →

Источники

  • https://docs.python.org/3/reference/datamodel.html
  • https://docs.python.org/3/library/contextlib.html

Связанные темы

Pythonerror-handlingresource-management

Вакансии с этим навыком

Python вакансии
  • Data and AI Architect
  • EDA Tool Software Engineer
  • Manufacturing Engineering Undergraduate Intern
  • MPQ MDCX Engineering Student Worker
  • Senior Machine Learning (ML) Engineer (CCC Casualty / Claims Intelligence)