Mediumcontextmanager
Что такое @contextmanager?
1Постановка
Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.
2Решение
@contextmanager (contextlib) — декоратор, превращающий generator-функцию в context manager. Короче, чем класс с __enter__/__exit__.
from contextlib import contextmanager
@contextmanager
def timer(label):
import time
start = time.time()
try:
yield # код до yield = __enter__, значение yield = as-переменная
finally:
print(f'{label}: {time.time() - start:.2f}s') # __exit__
with timer('operation'):
do_work()
# Встроенные из contextlib
from contextlib import suppress, redirect_stdout, ExitStack
with suppress(FileNotFoundError):
os.remove('temp.txt') # подавить FileNotFoundError
with ExitStack() as stack: # динамические context managers
files = [stack.enter_context(open(f)) for f in filenames]- Если exception внутри with — генератор получает его в yield, finally выполняется;
asynccontextmanager— дляasync with;- Идеален для простых cases без состояния; сложные (stateful) — класс.
3Как отвечать
- Сначала уточните условия и ограничения, покажите аналитическое мышление.
- Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
- Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡
На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.