Python Context Managers Advanced
Create advanced context managers for resource management.
Advanced resource management.
Class-Based Context Manager
```python class Timer: def __enter__(self): import time self.start = time.time() return self def __exit__(self, *args): import time self.end = time.time() print(f"Time: {self.end - self.start:.4f}s")
with Timer(): sum([i for i in range(1000000)]) ```
Error Handling
```python class ErrorHandler: def __enter__(self): return self def __exit__(self, exc_type, exc_val, exc_tb): if exc_type: print(f"Error: {exc_val}") return True # Suppress error return False
with ErrorHandler(): result = 10 / 0 # Error handled gracefully print("Program continues...") ```
Nested Context Managers
```python from contextlib import contextmanager, ExitStack
@contextmanager def open_file(name): f = open(name, 'w') try: yield f finally: f.close()
Open multiple files with ExitStack() as stack: files = [stack.enter_context(open_file(f"file{i}.txt")) for i in range(3)] for file in files: file.write("data") ```
Reusable Context Manager
```python from contextlib import contextmanager
@contextmanager def change_dir(path): import os old_dir = os.getcwd() os.chdir(path) try: yield finally: os.chdir(old_dir)
with change_dir("/tmp"): # Work in /tmp pass # Back to original directory ```
Remember
- __enter__ and __exit__ required - Return True in __exit__ to suppress errors - Use contextlib for simpler managers