Skip to main content

Using Your Custom Context Manager in Python

· 3 min read
Sudip Parajuli
Full Stack Django Developer | Data Science | IoT and Robotics

Many of you have used with open() as something: on file opening and similar tasks. But have you ever questioned yourself whether you can write your own custom context manager in Python? Yes, you heard that right! A context manager allows us to perform some setup and cleanup actions within a context, ensuring the necessary cleanup is done once the execution of the code is finished.

Basic Syntax

Here’s the basic syntax for using a context manager:

with <context-manager>(<args>):
# Write your custom code here
# The code will run within that context and end when the custom code is finished.

You can also assign the custom code return value to a variable:

with <context-manager>(<args>) as your_variable:
# Write your custom code here
# The code will run within that context and end when the custom code is finished.

Example of File Opening Context Manager

A common example of a context manager is file handling:

with open("your_file.txt") as file:
text = file.read()
length = len(text)

print(f'The file is {file} in length')

How to Write Your Custom Context Manager

There are two primary ways to create a custom context manager in Python: using a class with __enter__ and __exit__ methods, and using the contextlib module's contextmanager decorator.

Method 1: Using a Class

You can create a context manager by defining a class that implements the __enter__ and __exit__ methods. Here's an example:

class MyContextManager:
def __enter__(self):
# Setup code, runs at the start of the with block
print("Entering the context")
return self # This value is assigned to the variable after 'as'

def __exit__(self, exc_type, exc_value, traceback):
# Teardown code, runs at the end of the with block
print("Exiting the context")
# Handle exceptions if needed
if exc_type:
print(f"Exception type: {exc_type}")
print(f"Exception value: {exc_value}")
return False # Re-raises the exception if False, suppresses if True
return True

# Usage
with MyContextManager() as manager:
print("Inside the context")

Method 2: Using contextlib.contextmanager

Python’s contextlib module provides a simpler way to create context managers using the @contextmanager decorator. This involves a function that uses yield to separate setup and teardown code.

Here’s an example:

from contextlib import contextmanager

@contextmanager
def my_context():
# Setup code
print("Entering the context")
yield
# Teardown code
print("Exiting the context")

# Usage
with my_context():
print("Inside the context")

Conclusion

Creating custom context managers in Python is a powerful way to manage resources and ensure clean-up tasks are performed reliably. Whether using a class or the contextlib module, context managers help write cleaner, more maintainable code.

Experiment with custom context managers in your projects and see how they can simplify your resource management tasks!