context_managers.py (Source)

# Long and un-safe way, 'code smell' detected!
# f = open('test.md', 'r')
# file_contents = f.read()
# f.close()
# Use context manager
with open('test.md', 'r') as f:
    file_contents = f.read()
words = file_contents.split(' ')
word_counts = len(words)
print(f'{word_counts}')
# NB: Custom example
class ManagedWriteFile:
    def __init__(self, name):
        self.name = name
    def __enter__(self):
        self.file = open(self.name, 'w')
        return self.file
    def __exit__(self, exc_type, exc_val, exc_tb):
        if self.file:
            self.file.close()
with ManagedWriteFile('hello.txt') as f:
    f.write('requests==2.24.0')
    f.write('\n')
    f.write('Django>=3.1.3')