- __enter__
- __exit__
Context managers with class
Even if there was en exception in the middle of the process, the __exit__ methods of each object will be called.
examples/advanced/context-managers.py
class MyCM: def __init__(self, n): self.name = n def __enter__(self): print('__enter__', self.name) def __exit__(self, exception_type, exception, traceback): print('__exit__ ', self.name) def something(self): print('something', self.name) def main(): a = MyCM('a') b = MyCM('b') with a, b: a.partner = b b.partner = a a.something() raise Exception('nono') b.something() print('in main - after') main() print('after main')
__enter__ a __enter__ b something a __exit__ b __exit__ a Traceback (most recent call last): File "context-managers.py", line 27, in <module> main() File "context-managers.py", line 23, in main raise Exception('nono') Exception: nono