Better Programming

Advice for programmers.

Follow publication

Context Managers in Python

Halil Yıldırım
Better Programming
Published in
2 min readSep 24, 2019

--

Photo by Tyler Daviaux on Unsplash

In this piece, we are going to delve into context managers in Python. I will keep it short — less talk, more work! I hope you enjoy it.

Why Context Managers?

Context managers are used to give resources back. Here’s what I mean:

f = open('file.txt', 'w')
f.write('Something to write')

We opened a file named file.txt and wrote it. Hang on — we didn’t close this file, so we can still use thef instance:

f = open('file.txt', 'w')
f.write('Something to write')
print('another work')
f.write('I can still write to file.txt')

This is a problem — resources are not unlimited so we have to give it back when we’re done with it. Here’s how we do it:

f = open('file.txt', 'w')
f.write('Something to write')
f.close()

With f.close() we closed the file.txt, so we can’t use this f any more:

f = open('file.txt', 'w')
f.write('Something to write')
f.close()
print(f.closed) # returns True

print(f.closed) will print True because f is closed, thanks to f.close().

How Do We Use Context Manager?

With a with statement. Let me give you an example:

with open('file.txt', 'w') as f:
f.write('Something to write')

But wait — where is the f.close()? Don’t worry, the with statement will take care of this and close the file:

with open('file.txt', 'w') as f:
f.write('Something to write')
print(f.closed)

See — I told you that print(f.closed) would print True!

Great! So, How Can I Write Mine?

Let me help you create your own. There are two ways to do it — I prefer to do it with class but I’ll show you both methods.

Method one

class OpenFile:
def __init__(self, file, mode):
self.file = file
self.mode = mode

def __enter__(self):
self.f = open(self.file, self.mode)
return self.f

def __exit__(self, exc_type, exc_val, exc_tb):
self.f.close()

Method two

from contextlib import contextmanager


@contextmanager
def OpenFile(file, mode):
f = open(file, mode)
yield f
f.close()

Try it out!

with OpenFile('file.txt', 'w') as f:
f.write('Something to write to mine')
print(f.closed)

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

--

--

Halil Yıldırım
Halil Yıldırım

Written by Halil Yıldırım

Engineer. Software Developer. Follow me on Medium! Follow me on YouTube: https://www.youtube.com/@learngolang

Responses (2)

Write a response