- __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