Timer.enter сохраняет perf_counter() и возвращает self, а exit записывает разницу в elapsed. Возврат False не подавляет исключения из измеряемого блока.
Контекстный менеджер для измерения длительности
Timer.__enter__ сохраняет perf_counter() и возвращает self, а __exit__ записывает разницу в elapsed. Возврат False не подавляет исключения из измеряемого блока.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Создайте класс Timer, реализующий протокол контекстного менеджера. При входе в блок with начинается измерение времени, а при выходе из него вычисленное время сохраняется в поле elapsed экземпляра.
with Timer() as timer:
time.sleep(1)
print(timer.elapsed)
Ответ
Timer.enter сохраняет perf_counter() и возвращает self, а exit записывает разницу в elapsed. Возврат False не подавляет исключения из измеряемого блока.
Реализация:
from time import perf_counter
class Timer:
def __enter__(self):
self.started = perf_counter()
self.elapsed = None
return self
def __exit__(self, exc_type, exc_value, traceback):
self.elapsed = perf_counter() - self.started
return False
После with поле elapsed содержит секунды, включая ожидание и sleep. Его значение будет заполнено и при обычном исключении внутри блока. Один экземпляр не следует использовать во вложенных одновременных измерениях: started перезапишется. Для каждого такого интервала создавайте отдельный Timer.