https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_b964594d3d957944241961017b9eb19bf02834de44cce93d8e67dd306852dbe346167181e455e33d5268ea01d973d77bb056848546f31794f31a4c31a9da5aa3.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_23f1ae74c634d7e5e0a067c22b7a8c2d79c3ffd9a3b9395fc82c1b3b99635552b994f1f72f532f28ceaff1ea054ea026cd488cd62fa03a4ad91d212b5f3c5a72.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_451c3884f51125f7687e5bb07cfab033c04cb7174c33f93213b2af4bad2af13cf48b92a7fa95fc86d7d436f355938a3ac50aa119cdb7c9b6d5a52815c3e6033e.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_bfff9e63e857e9ee612e292d4a6edf3ced64d6a756925c953a9d8f77845ff601eca64d73dfa48756b1a9f4a4d6de6127a273bcde16ddeb71a22383460f4e94b0.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_f4dd7e1d73ae5eda35ed5ad6aa965b612dbf483ece3ca50c1e8e30ad8dff1c66a160ed75e958e2db399661d229874783e0834ad813a479437035666b8e9e3386.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_4fce0769137d4cd096989b0349bc3c2bbfca79ac311fdf714c41ab24d87551c7b49b756c8a8de090b0714a0ad0560e49fa532ba5a88875ea4afd78efac464df6.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_85cec8b07d60426b11040e471babca0d2f9c8dc87a9b56e06cad39828f7f67179e29609100f282a574872c9a93fb635b25416300eb4c97bc5a653d00cf6f8dbf.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_6768e5a27d4d357347338621c0d20bd269b126d30eec796193390f2f530fbaea60af84130c46f9786114be65149e661e87d55c339219c90aa76396d7e5b734ef.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_2acd6bdff3b680341e8c727da5169a647123eb8fd0a90253161b4c3af272c15d293bf9bb217008bb13f84d1910b0e166798001f8603b6c026d5c20a76c41d47c.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_8a4b32e6980926c7a175daa9b65493d8ca0ac942d5d66ff78951a7ea9d5b013bbb08256e813a2ff425942f42e3b503d52269f4a86c30e4598852fdfcf1f92f19.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_268c9bba6ba649318f0da28c37b09a9bbfa371210f9b6b52faa7fd8ae94abf6b3c3bfeb5df5705c93495ce1152ca58aeabc435d6c6c1bd959025165c3f50e086.js
  • Skip to main content
  • Skip to primary sidebar
  • Skip to footer
  • Home
  • Featured
    • Advanced Python Topics
    • AWS Learning Roadmap
    • JWT Complete Guide
    • Git CheatSheet
  • Explore
    • Programming
    • Development
      • microservices
      • Front End
    • Database
    • DevOps
    • Productivity
    • Tutorial Series
      • C# LinQ Tutorials
      • PHP Tutorials
  • Dev Tools
    • JSON Formatter
    • Diff Checker
    • JWT Decoder
    • JWT Generator
    • Base64 Converter
    • Data Format Converter
    • QR Code Generator
    • Javascript Minifier
    • CSS Minifier
    • Text Analyzer
  • About
  • Contact
CodeSamplez.com

CodeSamplez.com

Programming And Development Resources

You are here: Home / Programming / Python Context Managers: A Beginner’s Guide to “with” Statement

Python Context Managers: A Beginner’s Guide to “with” Statement

Updated May 30, 2025 by Rana Ahsan Leave a Comment ⏰ 8 minutes

python context manager tutorial

A Python context manager is a programming construct that automatically handles setup and teardown of resources using the with statement.

Today, we’re diving deep into the weeds of this one of the key advanced concepts in Python. The first time I heard about context managers, my brain did that thing where it just kinda… flatlined for a second.

But it turns out, once you get what they’re all about, they’re one of the slickest tricks Python has up its sleeve for writing clean, readable code. So buckle up—this will be a laid-back, real-talk intro to Python context managers.

What Exactly Is a Python Context Manager?

So, if the straight-forward definition we just provided above doesn’t make much sense yet, no worries. Let’s try to understand it with an analogy.

Think of a context manager like the ultimate cleanup crew. You know, when you’re done using something—say, a file or a network connection—you want to make sure it’s properly closed or released, right?

Well, without context managers, you’d be writing a bunch of try and finally blocks all over the place to make sure things close properly. And, ugh, who has time for that? Context managers automate this process, so you don’t have to worry about closing resources. You just use them, and they tidy up behind the scenes.

Context managers are Python’s elegant solution to managing resources. They help you automatically handle setup and teardown operations, ensuring your code is clean, safe, and less prone to memory leaks. Think of them as responsible housekeepers for your code.

How the `with` Statement Works?

A context manager in Python is anything that can use a with statement. Yeah, that’s it—with is the magic word. When you use something in a with block, Python automatically takes care of setting things up and tearing them down when you’re done.

Let’s look at a classic example: opening a file. If you’ve worked with files in Python before, you know they need to be closed after use. Otherwise, they’ll just hang around and could cause problems later on. Without a context manager, you might write code like this:

file = open('example.txt', 'w')
try:
    file.write('Hello, world!')
finally:
    file.close()Code language: PHP (php)
Python context manger execution flow using "with" statement

Now, this works, but it’s kinda clunky. And that’s where the context manager comes in. Watch how much cleaner this is with with:

# Context manager magic
with open('data.txt', 'r') as file:
    content = file.read()
# File automatically closes - no extra steps!Code language: PHP (php)

Notice how we didn’t explicitly call file.close() for the with block? That’s the beauty of context managers. No more manual cleanup! The python with statement takes care of the mechanism for us.

Why Use Context Managers?

As we already discussed above, Python context managers provide automatic resource management and cleanup, ensuring that resources like files, database connections, or locks are properly released even if an error occurs.

Some of the main benefits I admire very much are:

  • Automatic cleanup – Resources are guaranteed to be cleaned up when you exit the context, preventing resource leaks. With files, for example, with open('file.txt') as f: automatically closes the file whether your code succeeds or fails.
  • Exception safety – The cleanup happens even if an exception is raised, unlike manual resource management where you might forget to close something in error cases.
  • Cleaner code – Eliminates boilerplate try/finally blocks and makes your intent clearer. Instead of remembering to call .close() or .release(), the context manager handles it.
  • Prevention of common bugs – Reduces issues like file handle exhaustion, database connection leaks, or forgetting to release locks in multithreaded code.

The with statement is the most common way to use context managers, and you can create custom ones using the contextlib module or by implementing __enter__ and __exit__ methods. They’re particularly valuable when working with external resources, temporary state changes, or any situation where setup and teardown operations need to be paired reliably.

Creating A Custom Context Manager

Wanna level up? You can make your custom python context managers. Python gives you two main ways to do this: you can either use a class with special methods, or you can use the contextlib library, which is pretty handy if you want to keep things simple. Let’s look at both approaches below:

Method 1: Class-Based Context Manager

Let’s look at one real-world use case like a database connection as our example for this class-based context manager approach:

class DatabaseConnection:
    def __init__(self, db_url):
        self.db_url = db_url
        self.connection = None

    def __enter__(self):
        self.connection = connect_to_database(self.db_url)
        return self.connection

    def __exit__(self, exc_type, exc_val, exc_tb):
        if self.connection:
            self.connection.close()
        return False  # Propagate any exceptions

Here’s what’s happening: __enter__ runs when you start the with block(more like “setup” actions) , and __exit__ runs when you exit it( for “teardown” like actions)—simple as that.

Method 2: Function-Based with `contextlib`

from contextlib import contextmanager

@contextmanager
def temporary_file(filename, mode='w'):
    try:
        file = open(filename, mode)
        yield file
    finally:
        file.close()

with temporary_file("filepath"):
    print("Inside the context!")Code language: JavaScript (javascript)

It’s doing the same thing as the class-based version but without needing to define __enter__ and __exit__. The yield keyword splits the function into two parts: everything before yield runs when you enter the context, and everything after yield runs when you exit. (I have talked about the yield keyword more in the Python generators tutorial, in case you are interested)

What about asynchronous context managers?

An asynchronous Python context manager is essentially the async/await version of a regular context manager. Instead of using __enter__ and __exit__ methods, it uses __aenter__ and __aexit__ methods that are coroutines.

The key differences:

  • Methods: __aenter__ and __aexit__ instead of __enter__ and __exit__
  • Syntax: Used with async with instead of just with
  • Coroutines: Both methods are async and can contain await expressions
  • Use case: Designed for managing asynchronous resources like database connections, HTTP sessions, or file I/O in async code

Here’s a simple example, extending our file handling mechanism in asyn mode:

class AsyncFileManager:
    def __init__(self, filename):
        self.filename = filename
        
    async def __aenter__(self):
        # This can contain await expressions
        self.file = await some_async_file_open(self.filename)
        return self.file
        
    async def __aexit__(self, exc_type, exc_val, exc_tb):
        # Cleanup can also be async
        await self.file.aclose()

# Usage
async def main():
    async with AsyncFileManager('data.txt') as f:
        await f.write('Hello async world')

You can also create them using @asynccontextmanager decorator from contextlib, similar to how @contextmanager works for regular context managers, but with async def and yield.

Common Use Cases for Python Context Managers:

Some real-world use cases where context managers might be a good fit are as follows:

1. File Handling

As we already covered this example throughout this guide.

2. Database Transactions

Wrap a transaction so it’s committed on success or rolled back on error:

with db.transaction():
    db.insert(…)
    db.update(…)
Code language: CSS (css)

3. Thread‐ or Process‐Level Locks

Safely acquire and release locks around critical sections:

lock = threading.Lock()
with lock:
    # do thread-safe work
Code language: PHP (php)

4. Network/Sockets

Open a socket or HTTP connection and guarantee it’s closed:

with socket.create_connection(addr) as sock:
    sock.send(data)
Code language: JavaScript (javascript)

5. Temporary Files or Directories

Create a temp file/dir and automatically clean it up when done:

with tempfile.TemporaryDirectory() as tmpdir:
    # use tmpdir
Code language: PHP (php)

6. Timing/Profiling Blocks

Measure execution time via a timing context manager:

with Timer('block name'):
    do_heavy_work()Code language: JavaScript (javascript)

Common Gotchas and Pro Tips:

  • 1. Always handle potential exceptions in your `__exit__` method.
  • 2. Use `contextlib.suppress()` to ignore specific exceptions.
  • 3. Remember that context managers can nest – they play nice together!

Wrapping Up

Context managers might seem like magic initially, but they’re straightforward once you get the hang of them. They’ll save you from countless bugs and make your code look like a pro wrote it. Feel free to refer to the official Python documentation to learn more.

Alright, there you have it—the lowdown on Python context managers. They’re like that friend who stays late to help you clean up after a party, and honestly, who doesn’t need that in their code? Just remember to use them whenever you’re working with resources you need to “borrow” for a bit, like files, databases, or network connections. Your future self (and anyone reading your code) will thank you. Happy coding, and may your resources always be managed! 🐍✨

FAQs(Frequently Asked Questions)

Q: What’s the difference between a context manager and try/finally?

A context manager is essentially a convenient abstraction of try/finally. Instead of writing try/finally for every resource, a context manager encapsulates that pattern, making the code cleaner and less error-prone.

Q: Can I have multiple context managers in one with statement?

Yes. Python allows multiple context managers in a single with statement (comma-separated) or nested with statements. This makes it easy to manage several resources in one block.

Share if liked!

  • Click to share on Facebook (Opens in new window) Facebook
  • Click to share on X (Opens in new window) X
  • Click to share on LinkedIn (Opens in new window) LinkedIn
  • Click to share on Pinterest (Opens in new window) Pinterest
  • Click to share on Reddit (Opens in new window) Reddit
  • Click to share on Tumblr (Opens in new window) Tumblr
  • Click to share on Pocket (Opens in new window) Pocket

You may also like


Discover more from CodeSamplez.com

Subscribe to get the latest posts sent to your email.

First Published On: November 5, 2024 Filed Under: Programming Tagged With: python

About Rana Ahsan

Rana Ahsan is a seasoned software engineer and technology leader specialized in distributed systems and software architecture. With a Master’s in Software Engineering from Concordia University, his experience spans leading scalable architecture at Coursera and TopHat, contributing to open-source projects. This blog, CodeSamplez.com, showcases his passion for sharing practical insights on programming and distributed systems concepts and help educate others.
Github | X | LinkedIn

Reader Interactions

Leave a ReplyCancel reply

Primary Sidebar

  • Facebook
  • X
  • Pinterest
  • Tumblr

Subscribe via Email

Top Picks

python local environment setup

Python Local Development Environment: Complete Setup Guide

In-Depth JWT Tutorial Guide For Beginners

JSON Web Tokens (JWT): A Complete In-Depth Beginners Tutorial

The Ultimate Git Commands CheatSheet

Git Commands Cheatsheet: The Ultimate Git Reference

web development architecture case studies

Web Development Architecture Case Studies: Lessons From Titans

static website deployment s3 cloudfront

Host Static Website With AWS S3 And CloudFront – Step By Step

Featured Dev Tools

  • JSON Formatter
  • JWT Decoder

Recently Published

advanced service worker features

Advanced Service Worker Features: Push Beyond the Basics

service worker framework integration

Service Workers in React: Framework Integration Guide

service worker caching strategies

Service Worker Caching Strategies: Performance & Offline Apps

service worker lifecycle

Service Worker Lifecycle: Complete Guide for FE Developers

what is service worker

What Is a Service Worker? A Beginner’s Guide

Footer

Subscribe via Email

Follow Us

  • Facebook
  • X
  • Pinterest
  • Tumblr

Explore By Topics

Python | AWS | PHP | C# | Javascript

Copyright © 2025

https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_d3d499b9b7975a0ea6a6d01060493a142d4b88d0cc9366151f9294c34ef93954ee85d2478b1afa096e22df2a37a178aa3b283b20c12737f1d7344314eb7d8e21.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_c402e38f1879c18090377fb6b73b15ac158be453ecda3a54456494fe8aba42b990c293bae5424e5643d52515ffc2067e0819995be8d07d5bba9107a96780775c.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_ffc3511227531cc335353c54c3cbbaa11d0b80e5cb117478e144436c13cd05495b67af2e8950480ed54dbdabcdcef497c90fdb9814e88fe5978e1d56ce09f2cf.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_d57da9abfef16337e5bc44c4fc6488de258896ce8a4d42e1b53467f701a60ad499eb48d8ae790779e6b4b29bd016713138cd7ba352bce5724e2d3fe05d638b27.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_edc0e9ef106cc9ef7edd8033c5c6fcff6dc09ee901fd07f4b90a16d9345b35a06534f639e018a64baaf9384eee1df305570c1ecad747f41b787b89f53839962b.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_5a3aa28cd4eb24db3e3e2acd58230ff5cdc78120b94c2b118227d4c7806ecac03978e1a10404240314f66a3b82af8823768abb8b9eccc5003d198eb077ea12b8.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_dccc492dbbfdac33d1411f9df909e849c7268fcf99b43007f278cde3a0adc0ae00e8cae5ec81cf255b9a6eae74e239ba1fa935572af77173219cb081f7d2327d.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_00bacf9e36181aac2b666d110cd9d82257f846766e7041b2d7b3c909b458982931ccc9b203e37098fbdfcf43ca359cf04e3824a724a6789fc204196d3a72ad29.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_9ec67c9c17f4bd4ee02d35306a5bab19fdbef2a0fa3c6781f9fac40bcf7c642f79fefc0059051cc9082c8dece5be9cd4b37e2cf418ab5c3f4952d54517b24824.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_aa5a5d229b421633f4247380e1e8c0a4854f82efb35d13a5b07b7b8fbe22e98842a580f063e5965345a51c477a7f5c2585edf8dd7d896b2438dc61f91d8d970c.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_bb8058a9e234a7ffaa98891b1df7f6b8e67410e6984568b151daa05113b8c7f89d7b5918ae73f020998a16f7f5a087a13d6a9a5e5d7c301e2ca12fd9d1f8d177.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_647fb67570c6108fb10ae6785a1abdbecac99ffcf80351d0bef17c3cf783dce497b1895fcdaae997dacc72c359fbfb128cc1540dd7df56deb4961e1cd4b22636.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_f7a298a0f1f754623fe3b30f6910ce2c1373f715450750bd7a391571812b00df1917e2be90df6c4efc54dbdfda8616278a574dea02ba2c7a31992768df8db334.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_df30604d5842ef29888c3c1881220dc6d3f8854666d94f0680c5f38aa643c5fb79b10eb9f10998d8856eb24ca265783195937434fd6c2bb8e4846df0277a7fb7.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_f17fe6fb0993f1703181d7ae9e9ea570f3d33a43afd6f2a4567daa1a6745698c7b8193dc72d50991d2dd87cd3dcf663959206607d193a9b57926d061a1f50aef.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_945dcbab2c2a131f3c90f4fb91776b76066d589f84fb55bff25cd5d79a56218000616bfca1f0af9a74f32348693707af49e8fe624de8aa34f1e1c5b6a25709cf.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_65820d252e1b93596de6697fd5f02483f3e2524a0696c7d698b64745edb32bf5831a90e556842f5f88c8209766cc78ca3a41cf783d20236a9f90d4a7ea7b3e72.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_7286884797a1210857e2a36f8ab46604b0034b6abf512380447a5763c873db6a72b8547f660053de0ea69faef1eb64878f39ff4b0ea86c963efab95764a3bf5b.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_cbcf6c279ac6c6a25ae138bf964e64a5fd90d22dcdf8a53b6fe7b72cefa51063bfb0181a6e50dd2acdcae2795619887d1d83b10461e44e5103be756f2588d837.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_47965bc586b95810c925b9df3314e0c9a5cd121e70ca0831f87df0bc034695de4f83ecf2def86f737e14614ee138794473cf32cd3082a5d38db9dec0c1f266fa.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_12aa201cea075846d266536aa222d64d4088b851d87f55dac5e611b77add6826c8ebc6e82650fcd1a9e88a05a0072dedd195719c5f64cd4580a0acd8aee05d92.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_7859317dea28a85c983d7b2a933704b193600b52929d2d894deae21a5d78f1f9715214d4c2ed1b925e9183146806725621d586779705dea3b651260eb53a2f8a.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_659a39ac6c61957aa43ade7b155002e08bd9629f79c872157748a869ce6cc9d21acb90b74aaacd04bbdad47e3efe50e33a27231f112f2f8cea2bc66585e3d612.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_d87ea86dd0e7ecdd5fe7a5bb67becf943e57c3add866b456034d51663d099031bd563e12f61fdccc044969adf938a8584ed22ccd401ab8b669e20e4f92fb54e8.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_35311c3d71a3605fad4e1d6b50f3911311cdcc46418bdf56d6d0308a75a69585269ee7582a335e29989adf308fa1a81a10a2c2d4e257e9d680447a4996f6269e.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_f4fc182ef03c12e9dcadd6febc3dbaa4a29134469057ca9e8ec0be2f2de29a494514ff4b59798e74debf26f78b2df2b3e2665c69b77035761fb463b783202915.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_85c0f2769456e60153b0fd8364b82a035da53384f62de342d9bdca806f3f1ea56486919a00497a18d457949c82bf8bfacc4423fc332074ddf71a49a8fe628fff.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_67f99bef3678c549a14b5f2ff790cce6aba338dca29020755444231b45fa0f980f795e3658496ba70739a099b47b22bc2eab564343ac6132309de3adbbae3455.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_09eecfdd96206ed13830b4b93cfb2cc75cd38083671a34194437b5734b5bb38712209dc335b07e3266ceb3c3a44a155b9bbe5f3e0e1105b19dd45d3def76f020.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_4c089fbdb88e3b624a6f884d3ba1bf606f003bfcd3742376d0d353cd62181dc663aa3811a56361c3100de488fc4d6595a50de2b26f058921ba74f5f2c1b5be00.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_897ff6ac314c5f5e0f496c6af624bd9abf296a02cb5aeb850b9220b6dc3ce2fc4004cb02ed8b59d59d4b9c9d90f050d6eebc1d08ecaebab2f671f7d9367e6410.js
https://codesamplez.com/wp-content/cache/breeze-minification/js/breeze_67d1e619e71d36ae00ddcf85ee18628bb4eb64fcb3d6119b463e75cb987013420a21136d19cd03e6634ccc01cfa9af4a357930e4cf6900953b7812efb4f249fb.js