![]()
1. What is a Context Manager?
A context manager in Python is an object that manages resources (like files, database connections, network sockets) using the with statement. It ensures that resources are automatically cleaned up when they are no longer needed.
Simplifies resource management
Automatically handles setup and cleanup
Prevents resource leaks (e.g., forgetting to close files)
2. The with Statement (Basic Example)
The with statement ensures that a resource is opened, used, and properly closed, even if an error occurs.
Example: Using with for File Handling
with open("example.txt", "w") as file:
file.write("Hello, World!")
# File is automatically closed after the block
Without with (Manual Cleanup)
file = open("example.txt", "w")
try:
file.write("Hello, World!")
finally:
file.close() # Must manually close the file
The with statement is better because it guarantees file closure.
3. Creating a Custom Context Manager (Class-Based)
To create a custom context manager, define a class with:
__enter__(): Runs when entering thewithblock__exit__(): Runs when exiting thewithblock
Example: Custom File Handler
class FileManager:
def __init__(self, filename, mode):
self.file = open(filename, mode)
def __enter__(self):
return self.file # Returns the file object
def __exit__(self, exc_type, exc_value, traceback):
self.file.close() # Closes the file automatically
# Using the custom context manager
with FileManager("example.txt", "w") as file:
file.write("Custom context manager!")
If an exception occurs inside with, __exit__() handles cleanup.
4. Using contextlib for Simpler Context Managers
The contextlib module provides @contextmanager for function-based context managers.
Example: Creating a Context Manager Using contextlib.contextmanager
from contextlib import contextmanager
@contextmanager
def open_file(filename, mode):
file = open(filename, mode)
try:
yield file # Provide file object
finally:
file.close() # Ensure cleanup
with open_file("example.txt", "w") as file:
file.write("Using @contextmanager!")
More concise than class-based context managers.
5. Real-World Use Cases of Context Managers
| Use Case | Example |
|---|---|
| File Handling | with open("file.txt", "r") as f: |
| Database Connection | with sqlite3.connect("db.sqlite") as conn: |
| Thread Locking | with threading.Lock(): |
| Temporary Files | with tempfile.TemporaryFile() as tmpfile: |
| Suppressing Exceptions | with contextlib.suppress(FileNotFoundError): |
6. Using contextlib.suppress to Ignore Exceptions
from contextlib import suppress
with suppress(ZeroDivisionError):
print(1 / 0) # No error raised
Prevents unnecessary try-except blocks.
