In programming, much like in real life, it's important to clean up our toys after we're done playing with them. For example, forgetting to close a connection to a database can waste valuable resources on your database server, and forgetting to close a file might result in data loss, or your operating system refusing to open new files in your program.
# set up a thing
connection = open_db_connection()
# use a thing
run_analysis(connection)
# clean up the thing
connection.close()
There is a problem in the code snippet above though. What happens if run_analysis
throws an Exception, and crashes your program? In that case, the connection.close()
line will never get executed, and your database server won't know the connection can be closed
In Python, we can use a try ... finally
block to deal with this issue. In contrast to an except
block, which only runs in case the try
block throws an exception, The code in the finally
block will always be executed, whether the try
block threw an exception or not
# set up a thing
connection = open_db_connection()
try:
# use a thing
run_analysis(connection)
finally:
# clean up the thing
connection.close()
One of the downsides of this approach is that the 'set up' of the connection and the 'clean up' of the connetion are separated by a (potentially quite large) block of code. This makes it quite easy to do the 'wrong' thing and forget to close the connection.
Python tries to make it hard to do the wrong thing, and to that end, PEP-310 first introduced a bit of syntax to the language that made it impossible to forget to clean up resources, the with
statement. Using this with
statement (also known as a context manager), the code snippet above can be simplified to:
with open_db_connection() as connection:
run_analysis(connection)
Once the with block is entered, the connection gets created and stored in the connection
variable. Then, the body of the with block gets executed, after which the connection will get closed by the context manager automatically, no matter whether run_analysis
threw an exception or not.
The goal of this series of video is to explain these "context manager"-blocks in more detail.