Менеджеры контекста
@pyproglibМенеджеры контекста в основном используются для правильного управления ресурсами. Наиболее часто они используются для открытия файла: open(‘workfile’, ‘r’) as f:.
Однако большинство разработчиков не знают, как все они работают на самом деле и как создать свой собственный.
На самом деле, менеджер контекста это просто класс , который реализует методы __enter__ и __exit__.
from time import time
class Timer():
def __init__(self, message):
self.message = message
def __enter__(self):
self.start = time()
return None # Возвращает что угодно, чтобы использовать следующим образом:
Timer("Message") as value:
def __exit__(self, type, value, traceback):
elapsed_time = (time() - self.start) * 1000
print(self.message.format(elapsed_time))
with Timer("Elapsed time to compute some prime numbers: {}ms"):
primes = []
for x in range(2, 500):
if not any(x % p == 0 for p in primes):
primes.append(x)
print("Primes: {}".format(primes))
В простых случаях можно использовать генератор функций с одним yield, используя декоратор @contextmanager.
from contextlib import contextmanager
@contextmanager
def colored_output(color):
print("\033[%sm" % color, end="")
yield
print("\033[0m", end="")
print("Hello, World!")
with colored_output(31):
print("Now in color!")
print("So cool.")