1. What is the with Statement?
Python's with
statement simplifies resource management and exception handling. It ensures that resources like files, network connections, and databases are properly acquired and released.
2. Basic Usage
with open('example.txt', 'r') as file:
data = file.read()
print(data)
In this example, the file example.txt
is opened in read mode, its contents are read, and the file is automatically closed after the block is executed.
3. What is a Context Manager?
The with
statement works with context managers, which implement the __enter__()
and __exit__()
methods to manage resource setup and teardown.
4. Custom Context Manager
class CustomContextManager:
def __enter__(self):
print("Setting up resource")
return self
def __exit__(self, exc_type, exc_value, traceback):
print("Releasing resource")
with CustomContextManager() as manager:
print("Performing task")
This example demonstrates a custom context manager that manages resource setup and release.
5. Using contextlib Module
from contextlib import contextmanager
@contextmanager
def managed_resource():
print("Setting up resource")
yield
print("Releasing resource")
with managed_resource():
print("Performing task")
The contextlib
module's @contextmanager
decorator allows for easy creation of function-based context managers.
6. Nested with Statements
with open('file1.txt', 'r') as f1, open('file2.txt', 'r') as f2:
data1 = f1.read()
data2 = f2.read()
When managing multiple resources simultaneously, nested with
statements can be used as shown above.
7. Advanced Usage Examples
7.1. Database Connection
import sqlite3
with sqlite3.connect('example.db') as conn:
cursor = conn.cursor()
cursor.execute('SELECT * FROM users')
results = cursor.fetchall()
7.2. Network Socket
import socket
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect(('localhost', 8080))
s.sendall(b'Hello, world')
data = s.recv(1024)
7.3. Measuring Execution Time
import time
class Timer:
def __enter__(self):
self.start = time.time()
return self
def __exit__(self, *args):
self.end = time.time()
print(f"Execution time: {self.end - self.start} seconds")
with Timer():
time.sleep(2)
Comments
Post a Comment