Python supports context management. Which often used when handling resources, for example, file, network connection. With statement helps make sure the resources are cleaned up or released. There are two major functions for context management: __enter__
and __exit__
.
__enter__
is triggered when the with
statement is first triggered, while __exit__
statement is triggered when the statement finishes execution.
One very common usage of with statement is when we open up files:
with open('/path/to/file', 'r') as file: for line in file(): print(line)
The with
statement on this example will automatically close the file descriptor no matter how this with block exits.
Python with statement also supports nesting, for example:
with open('/open/to/file', 'r') as infile: with open('write/to/file', 'w') as outfile: for line in infile: if line.startswith('Test'): outfile.write(line)
If you want your code to support with statement based context management, just override the two functions on your code, for example:
class Resource: def __init__(self, res): self.res = res def __enter__(self): #define your code here def __exit__(self, exc_type, exc_value, traceback): #define your code here
There is another way to support context management, which is to use the contextlib.contextmanager
, we will introduce this later.