0

Hey everybody. I was reading some code on the website and I saw this:

with open(FILE) as number_file:
lucky_numbers = [set(line.strip().split('-')) for line in number_file]

What does "with ... as ..." mean? What is it used for? How is it used?

Edited by Joeflims: n/a

2
Contributors
2
Replies
4
Views
6 Years
Discussion Span
Last Post by Joeflims
0

The with statement applies to instances having 2 methods: "__enter__" and "__exit__". When the with statement is encountered, the instance's __enter__ method is called and its return value is used for the 'as' part of the statement. When the block exits, the instance's __exit__ method is called to perform cleanup action. In the case of a file object, the __exit__ method closes the file.

class A(object):
    def __enter__(self):
        print("entering block")
        return "block value"
    def __exit__(self, *args):
        print("exiting block")
        
with A() as value:
    print(value)

"""
my output -->
entering block
block value
exiting block
"""

An alternative to writing a class to create such 'context' instances is to write a function with a single "yield" statement and use the contextmanager decorator like this

from contextlib import contextmanager

@contextmanager
def B():
    print("entering block")
    yield "block value"
    print("exiting block")
    
with B() as value:
    print(value)

""" my output -->
entering block
block value
exiting block
"""

As a more useful example, here is a context which executes a block of statement in a given directory and comes back to the initial directory at the end of the block

@contextmanager
def working_directory(path):
    import os
    old = os.getcwd()
    try:
        os.chdir(path)
        yield # this is where the code in the "with" block will be executed
    finally:
        os.chdir(old)

import os.path

with working_directory(os.path.expanduser("~")):
    print(os.getcwd())

Here are 2 more funny contexts: http://www.daniweb.com/software-development/python/code/317854

Edited by Gribouillis: n/a

This question has already been answered. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.