Below is the initial context manager that we started with.
class PrintingContextManager: def __enter__(self): print('entering the context manager') return "i am the returned value" def __exit__(self, exc_type, exc_value, traceback): print('exiting the context manager') with PrintingContextManager() as var: print('inside the context manager') print(var)
We can choose to rewrite this context manager in a more consise way though by using a generator and a decorator.
from contextlib import contextmanager @contextmanager def printing_context_manager(): print('entering the context manager') yield "i am the returned value" print('exiting the context manager') with printing_context_manager() as var: print('inside the context manager') print(var)
Effectively everything that occurs before the
yield statement can be seen as the code that would run in
__enter__ beforehand and the code that would run after could be seen as the
__exit__ before. In general this functional take is seen as a simpler method of implementing context managers, but it's good to know that you can pick either if you're interested.