Менеджеры контекста

Менеджеры контекста

@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.")

Report Page