blob: d5a1068a734fd69323417aa7aef3681f0a98cd67 [file] [log] [blame]
Serhiy Storchaka2b57c432018-12-19 08:09:46 +02001:mod:`!contextlib` --- Utilities for :keyword:`!with`\ -statement contexts
2==========================================================================
Georg Brandl116aa622007-08-15 14:28:22 +00003
4.. module:: contextlib
5 :synopsis: Utilities for with-statement contexts.
6
Raymond Hettinger10480942011-01-10 03:26:08 +00007**Source code:** :source:`Lib/contextlib.py`
Georg Brandl116aa622007-08-15 14:28:22 +00008
Raymond Hettinger4f707fd2011-01-10 19:54:11 +00009--------------
10
Georg Brandl116aa622007-08-15 14:28:22 +000011This module provides utilities for common tasks involving the :keyword:`with`
12statement. For more information see also :ref:`typecontextmanager` and
13:ref:`context-managers`.
14
Georg Brandl116aa622007-08-15 14:28:22 +000015
Nick Coghlan3267a302012-05-21 22:54:43 +100016Utilities
17---------
18
19Functions and classes provided:
Georg Brandl116aa622007-08-15 14:28:22 +000020
Brett Cannon9e080e02016-04-08 12:15:27 -070021.. class:: AbstractContextManager
22
Brett Cannon516f5462016-06-09 15:55:52 -070023 An :term:`abstract base class` for classes that implement
Brett Cannon9e080e02016-04-08 12:15:27 -070024 :meth:`object.__enter__` and :meth:`object.__exit__`. A default
25 implementation for :meth:`object.__enter__` is provided which returns
26 ``self`` while :meth:`object.__exit__` is an abstract method which by default
27 returns ``None``. See also the definition of :ref:`typecontextmanager`.
28
29 .. versionadded:: 3.6
30
31
Jelle Zijlstra176baa32017-12-13 17:19:17 -080032.. class:: AbstractAsyncContextManager
33
34 An :term:`abstract base class` for classes that implement
35 :meth:`object.__aenter__` and :meth:`object.__aexit__`. A default
36 implementation for :meth:`object.__aenter__` is provided which returns
37 ``self`` while :meth:`object.__aexit__` is an abstract method which by default
38 returns ``None``. See also the definition of
39 :ref:`async-context-managers`.
40
41 .. versionadded:: 3.7
42
Brett Cannon9e080e02016-04-08 12:15:27 -070043
Georg Brandl8a1caa22010-07-29 16:01:11 +000044.. decorator:: contextmanager
Georg Brandl116aa622007-08-15 14:28:22 +000045
Christian Heimesd8654cf2007-12-02 15:22:16 +000046 This function is a :term:`decorator` that can be used to define a factory
47 function for :keyword:`with` statement context managers, without needing to
48 create a class or separate :meth:`__enter__` and :meth:`__exit__` methods.
Georg Brandl116aa622007-08-15 14:28:22 +000049
Matthias Bussonnierbde782b2018-07-23 14:10:56 -070050 While many objects natively support use in with statements, sometimes a
51 resource needs to be managed that isn't a context manager in its own right,
52 and doesn't implement a ``close()`` method for use with ``contextlib.closing``
53
54 An abstract example would be the following to ensure correct resource
55 management::
Georg Brandl116aa622007-08-15 14:28:22 +000056
Georg Brandl116aa622007-08-15 14:28:22 +000057 from contextlib import contextmanager
58
59 @contextmanager
Matthias Bussonnierbde782b2018-07-23 14:10:56 -070060 def managed_resource(*args, **kwds):
61 # Code to acquire resource, e.g.:
62 resource = acquire_resource(*args, **kwds)
63 try:
64 yield resource
65 finally:
66 # Code to release resource, e.g.:
67 release_resource(resource)
Georg Brandl116aa622007-08-15 14:28:22 +000068
Matthias Bussonnierbde782b2018-07-23 14:10:56 -070069 >>> with managed_resource(timeout=3600) as resource:
70 ... # Resource is released at the end of this block,
71 ... # even if code in the block raises an exception
Georg Brandl116aa622007-08-15 14:28:22 +000072
Georg Brandl9afde1c2007-11-01 20:32:30 +000073 The function being decorated must return a :term:`generator`-iterator when
74 called. This iterator must yield exactly one value, which will be bound to
Serhiy Storchaka2b57c432018-12-19 08:09:46 +020075 the targets in the :keyword:`with` statement's :keyword:`!as` clause, if any.
Georg Brandl116aa622007-08-15 14:28:22 +000076
77 At the point where the generator yields, the block nested in the :keyword:`with`
78 statement is executed. The generator is then resumed after the block is exited.
79 If an unhandled exception occurs in the block, it is reraised inside the
80 generator at the point where the yield occurred. Thus, you can use a
81 :keyword:`try`...\ :keyword:`except`...\ :keyword:`finally` statement to trap
82 the error (if any), or ensure that some cleanup takes place. If an exception is
83 trapped merely in order to log it or to perform some action (rather than to
84 suppress it entirely), the generator must reraise that exception. Otherwise the
Serhiy Storchaka2b57c432018-12-19 08:09:46 +020085 generator context manager will indicate to the :keyword:`!with` statement that
Georg Brandl116aa622007-08-15 14:28:22 +000086 the exception has been handled, and execution will resume with the statement
Serhiy Storchaka2b57c432018-12-19 08:09:46 +020087 immediately following the :keyword:`!with` statement.
Georg Brandl116aa622007-08-15 14:28:22 +000088
Nick Coghlan0ded3e32011-05-05 23:49:25 +100089 :func:`contextmanager` uses :class:`ContextDecorator` so the context managers
90 it creates can be used as decorators as well as in :keyword:`with` statements.
91 When used as a decorator, a new generator instance is implicitly created on
92 each function call (this allows the otherwise "one-shot" context managers
93 created by :func:`contextmanager` to meet the requirement that context
94 managers support multiple invocations in order to be used as decorators).
Michael Foordb3a89842010-06-30 12:17:50 +000095
96 .. versionchanged:: 3.2
97 Use of :class:`ContextDecorator`.
Georg Brandl116aa622007-08-15 14:28:22 +000098
Georg Brandl86e78d12010-07-18 13:43:32 +000099
Jelle Zijlstra2e624692017-04-30 18:25:58 -0700100.. decorator:: asynccontextmanager
101
102 Similar to :func:`~contextlib.contextmanager`, but creates an
103 :ref:`asynchronous context manager <async-context-managers>`.
104
105 This function is a :term:`decorator` that can be used to define a factory
106 function for :keyword:`async with` statement asynchronous context managers,
107 without needing to create a class or separate :meth:`__aenter__` and
108 :meth:`__aexit__` methods. It must be applied to an :term:`asynchronous
109 generator` function.
110
111 A simple example::
112
113 from contextlib import asynccontextmanager
114
115 @asynccontextmanager
116 async def get_connection():
117 conn = await acquire_db_connection()
118 try:
Alexander Vasin416cbce2018-08-25 05:38:11 +0300119 yield conn
Jelle Zijlstra2e624692017-04-30 18:25:58 -0700120 finally:
121 await release_db_connection(conn)
122
123 async def get_all_users():
124 async with get_connection() as conn:
125 return conn.query('SELECT ...')
126
127 .. versionadded:: 3.7
128
Kazantcev Andrey178695b2020-11-05 11:52:24 +0300129 Context managers defined with :func:`asynccontextmanager` can be used
130 either as decorators or with :keyword:`async with` statements::
131
132 import time
133
134 async def timeit():
135 now = time.monotonic()
136 try:
137 yield
138 finally:
139 print(f'it took {time.monotonic() - now}s to run')
140
141 @timeit()
142 async def main():
143 # ... async code ...
144
145 When used as a decorator, a new generator instance is implicitly created on
146 each function call. This allows the otherwise "one-shot" context managers
147 created by :func:`asynccontextmanager` to meet the requirement that context
148 managers support multiple invocations in order to be used as decorators.
149
150 .. versionchanged:: 3.10
151 Async context managers created with :func:`asynccontextmanager` can
152 be used as decorators.
153
Jelle Zijlstra2e624692017-04-30 18:25:58 -0700154
Georg Brandl116aa622007-08-15 14:28:22 +0000155.. function:: closing(thing)
156
157 Return a context manager that closes *thing* upon completion of the block. This
158 is basically equivalent to::
159
160 from contextlib import contextmanager
161
162 @contextmanager
163 def closing(thing):
164 try:
165 yield thing
166 finally:
167 thing.close()
168
169 And lets you write code like this::
170
Georg Brandl116aa622007-08-15 14:28:22 +0000171 from contextlib import closing
Georg Brandl0f7ede42008-06-23 11:23:31 +0000172 from urllib.request import urlopen
Georg Brandl116aa622007-08-15 14:28:22 +0000173
Georg Brandl0f7ede42008-06-23 11:23:31 +0000174 with closing(urlopen('http://www.python.org')) as page:
Georg Brandl116aa622007-08-15 14:28:22 +0000175 for line in page:
Georg Brandl6911e3c2007-09-04 07:15:32 +0000176 print(line)
Georg Brandl116aa622007-08-15 14:28:22 +0000177
178 without needing to explicitly close ``page``. Even if an error occurs,
179 ``page.close()`` will be called when the :keyword:`with` block is exited.
180
Georg Brandla7c17e52013-10-13 22:25:10 +0200181
Joongi Kim6e8dcda2020-11-02 17:02:48 +0900182.. class:: aclosing(thing)
183
184 Return an async context manager that calls the ``aclose()`` method of *thing*
185 upon completion of the block. This is basically equivalent to::
186
187 from contextlib import asynccontextmanager
188
189 @asynccontextmanager
190 async def aclosing(thing):
191 try:
192 yield thing
193 finally:
194 await thing.aclose()
195
196 Significantly, ``aclosing()`` supports deterministic cleanup of async
197 generators when they happen to exit early by :keyword:`break` or an
198 exception. For example::
199
200 from contextlib import aclosing
201
202 async with aclosing(my_generator()) as values:
203 async for value in values:
204 if value == 42:
205 break
206
207 This pattern ensures that the generator's async exit code is executed in
208 the same context as its iterations (so that exceptions and context
209 variables work as expected, and the exit code isn't run after the
210 lifetime of some task it depends on).
211
212 .. versionadded:: 3.10
213
214
Jesse-Bakker0784a2e2017-11-23 01:23:28 +0100215.. _simplifying-support-for-single-optional-context-managers:
216
217.. function:: nullcontext(enter_result=None)
218
Daniel Porteousc2875452018-07-09 06:49:29 -0700219 Return a context manager that returns *enter_result* from ``__enter__``, but
Jesse-Bakker0784a2e2017-11-23 01:23:28 +0100220 otherwise does nothing. It is intended to be used as a stand-in for an
221 optional context manager, for example::
222
Daniel Porteousc2875452018-07-09 06:49:29 -0700223 def myfunction(arg, ignore_exceptions=False):
224 if ignore_exceptions:
225 # Use suppress to ignore all exceptions.
226 cm = contextlib.suppress(Exception)
227 else:
228 # Do not ignore any exceptions, cm has no effect.
229 cm = contextlib.nullcontext()
230 with cm:
231 # Do something
232
233 An example using *enter_result*::
234
Jesse-Bakker0784a2e2017-11-23 01:23:28 +0100235 def process_file(file_or_path):
236 if isinstance(file_or_path, str):
237 # If string, open file
238 cm = open(file_or_path)
239 else:
240 # Caller is responsible for closing file
241 cm = nullcontext(file_or_path)
242
243 with cm as file:
244 # Perform processing on the file
245
246 .. versionadded:: 3.7
247
248
Nick Coghlan240f86d2013-10-17 23:40:57 +1000249.. function:: suppress(*exceptions)
Raymond Hettingere318a882013-03-10 22:26:51 -0700250
Nick Coghlan240f86d2013-10-17 23:40:57 +1000251 Return a context manager that suppresses any of the specified exceptions
252 if they occur in the body of a with statement and then resumes execution
253 with the first statement following the end of the with statement.
Raymond Hettingere318a882013-03-10 22:26:51 -0700254
Nick Coghlan240f86d2013-10-17 23:40:57 +1000255 As with any other mechanism that completely suppresses exceptions, this
256 context manager should be used only to cover very specific errors where
257 silently continuing with program execution is known to be the right
258 thing to do.
Nick Coghlanb4534ae2013-10-13 23:23:08 +1000259
Raymond Hettingere318a882013-03-10 22:26:51 -0700260 For example::
261
Nick Coghlan240f86d2013-10-17 23:40:57 +1000262 from contextlib import suppress
Raymond Hettingere318a882013-03-10 22:26:51 -0700263
Nick Coghlan240f86d2013-10-17 23:40:57 +1000264 with suppress(FileNotFoundError):
Raymond Hettingere318a882013-03-10 22:26:51 -0700265 os.remove('somefile.tmp')
266
Nick Coghlan240f86d2013-10-17 23:40:57 +1000267 with suppress(FileNotFoundError):
268 os.remove('someotherfile.tmp')
269
Raymond Hettingere318a882013-03-10 22:26:51 -0700270 This code is equivalent to::
271
272 try:
273 os.remove('somefile.tmp')
Nick Coghlanb4534ae2013-10-13 23:23:08 +1000274 except FileNotFoundError:
Raymond Hettingere318a882013-03-10 22:26:51 -0700275 pass
276
Nick Coghlan240f86d2013-10-17 23:40:57 +1000277 try:
278 os.remove('someotherfile.tmp')
279 except FileNotFoundError:
280 pass
281
Nick Coghlan8608d262013-10-20 00:30:51 +1000282 This context manager is :ref:`reentrant <reentrant-cms>`.
283
Raymond Hettingere318a882013-03-10 22:26:51 -0700284 .. versionadded:: 3.4
Georg Brandl116aa622007-08-15 14:28:22 +0000285
Nick Coghlanb4534ae2013-10-13 23:23:08 +1000286
Raymond Hettinger088cbf22013-10-10 00:46:57 -0700287.. function:: redirect_stdout(new_target)
288
289 Context manager for temporarily redirecting :data:`sys.stdout` to
290 another file or file-like object.
291
292 This tool adds flexibility to existing functions or classes whose output
293 is hardwired to stdout.
294
295 For example, the output of :func:`help` normally is sent to *sys.stdout*.
Serhiy Storchakad65c9492015-11-02 14:10:23 +0200296 You can capture that output in a string by redirecting the output to an
Raymond Hettinger088cbf22013-10-10 00:46:57 -0700297 :class:`io.StringIO` object::
298
299 f = io.StringIO()
300 with redirect_stdout(f):
301 help(pow)
302 s = f.getvalue()
303
304 To send the output of :func:`help` to a file on disk, redirect the output
305 to a regular file::
306
307 with open('help.txt', 'w') as f:
308 with redirect_stdout(f):
309 help(pow)
310
311 To send the output of :func:`help` to *sys.stderr*::
312
313 with redirect_stdout(sys.stderr):
314 help(pow)
315
Nick Coghlanb4534ae2013-10-13 23:23:08 +1000316 Note that the global side effect on :data:`sys.stdout` means that this
317 context manager is not suitable for use in library code and most threaded
318 applications. It also has no effect on the output of subprocesses.
319 However, it is still a useful approach for many utility scripts.
320
Nick Coghlan36d8ef92014-10-12 10:25:00 +1000321 This context manager is :ref:`reentrant <reentrant-cms>`.
Nick Coghlan8608d262013-10-20 00:30:51 +1000322
Raymond Hettinger088cbf22013-10-10 00:46:57 -0700323 .. versionadded:: 3.4
324
Georg Brandla7c17e52013-10-13 22:25:10 +0200325
Berker Peksagbb44fe02014-11-28 23:28:06 +0200326.. function:: redirect_stderr(new_target)
327
328 Similar to :func:`~contextlib.redirect_stdout` but redirecting
329 :data:`sys.stderr` to another file or file-like object.
330
331 This context manager is :ref:`reentrant <reentrant-cms>`.
332
333 .. versionadded:: 3.5
334
335
Michael Foordb3a89842010-06-30 12:17:50 +0000336.. class:: ContextDecorator()
337
338 A base class that enables a context manager to also be used as a decorator.
339
340 Context managers inheriting from ``ContextDecorator`` have to implement
341 ``__enter__`` and ``__exit__`` as normal. ``__exit__`` retains its optional
342 exception handling even when used as a decorator.
343
Georg Brandl86e78d12010-07-18 13:43:32 +0000344 ``ContextDecorator`` is used by :func:`contextmanager`, so you get this
345 functionality automatically.
346
347 Example of ``ContextDecorator``::
Michael Foordb3a89842010-06-30 12:17:50 +0000348
349 from contextlib import ContextDecorator
350
351 class mycontext(ContextDecorator):
Georg Brandl86e78d12010-07-18 13:43:32 +0000352 def __enter__(self):
353 print('Starting')
354 return self
Michael Foordb3a89842010-06-30 12:17:50 +0000355
Georg Brandl86e78d12010-07-18 13:43:32 +0000356 def __exit__(self, *exc):
357 print('Finishing')
358 return False
Michael Foordb3a89842010-06-30 12:17:50 +0000359
360 >>> @mycontext()
361 ... def function():
Georg Brandl86e78d12010-07-18 13:43:32 +0000362 ... print('The bit in the middle')
Michael Foordb3a89842010-06-30 12:17:50 +0000363 ...
364 >>> function()
365 Starting
366 The bit in the middle
367 Finishing
368
369 >>> with mycontext():
Georg Brandl86e78d12010-07-18 13:43:32 +0000370 ... print('The bit in the middle')
Michael Foordb3a89842010-06-30 12:17:50 +0000371 ...
372 Starting
373 The bit in the middle
374 Finishing
375
Georg Brandl86e78d12010-07-18 13:43:32 +0000376 This change is just syntactic sugar for any construct of the following form::
377
378 def f():
379 with cm():
380 # Do stuff
381
382 ``ContextDecorator`` lets you instead write::
383
384 @cm()
385 def f():
386 # Do stuff
387
388 It makes it clear that the ``cm`` applies to the whole function, rather than
389 just a piece of it (and saving an indentation level is nice, too).
390
Michael Foordb3a89842010-06-30 12:17:50 +0000391 Existing context managers that already have a base class can be extended by
392 using ``ContextDecorator`` as a mixin class::
393
394 from contextlib import ContextDecorator
395
396 class mycontext(ContextBaseClass, ContextDecorator):
Georg Brandl86e78d12010-07-18 13:43:32 +0000397 def __enter__(self):
398 return self
Michael Foordb3a89842010-06-30 12:17:50 +0000399
Georg Brandl86e78d12010-07-18 13:43:32 +0000400 def __exit__(self, *exc):
401 return False
Michael Foordb3a89842010-06-30 12:17:50 +0000402
Nick Coghlan0ded3e32011-05-05 23:49:25 +1000403 .. note::
404 As the decorated function must be able to be called multiple times, the
405 underlying context manager must support use in multiple :keyword:`with`
406 statements. If this is not the case, then the original construct with the
Serhiy Storchaka2b57c432018-12-19 08:09:46 +0200407 explicit :keyword:`!with` statement inside the function should be used.
Nick Coghlan0ded3e32011-05-05 23:49:25 +1000408
Michael Foordb3a89842010-06-30 12:17:50 +0000409 .. versionadded:: 3.2
410
411
kj133aa2d2020-11-06 00:16:27 +0800412.. class:: AsyncContextDecorator
Kazantcev Andrey178695b2020-11-05 11:52:24 +0300413
kj133aa2d2020-11-06 00:16:27 +0800414 Similar to :class:`ContextDecorator` but only for asynchronous functions.
Kazantcev Andrey178695b2020-11-05 11:52:24 +0300415
kj133aa2d2020-11-06 00:16:27 +0800416 Example of ``AsyncContextDecorator``::
Kazantcev Andrey178695b2020-11-05 11:52:24 +0300417
418 from asyncio import run
419 from contextlib import AsyncContextDecorator
420
421 class mycontext(AsyncContextDecorator):
422 async def __aenter__(self):
423 print('Starting')
424 return self
425
426 async def __aexit__(self, *exc):
427 print('Finishing')
428 return False
429
430 >>> @mycontext()
431 ... async def function():
432 ... print('The bit in the middle')
433 ...
434 >>> run(function())
435 Starting
436 The bit in the middle
437 Finishing
438
439 >>> async def function():
440 ... async with mycontext():
441 ... print('The bit in the middle')
442 ...
443 >>> run(function())
444 Starting
445 The bit in the middle
446 Finishing
447
kj133aa2d2020-11-06 00:16:27 +0800448 .. versionadded:: 3.10
449
Kazantcev Andrey178695b2020-11-05 11:52:24 +0300450
Nick Coghlan3267a302012-05-21 22:54:43 +1000451.. class:: ExitStack()
452
453 A context manager that is designed to make it easy to programmatically
454 combine other context managers and cleanup functions, especially those
455 that are optional or otherwise driven by input data.
456
457 For example, a set of files may easily be handled in a single with
458 statement as follows::
459
460 with ExitStack() as stack:
461 files = [stack.enter_context(open(fname)) for fname in filenames]
462 # All opened files will automatically be closed at the end of
463 # the with statement, even if attempts to open files later
Andrew Svetlov5b898402012-12-18 21:26:36 +0200464 # in the list raise an exception
Nick Coghlan3267a302012-05-21 22:54:43 +1000465
466 Each instance maintains a stack of registered callbacks that are called in
467 reverse order when the instance is closed (either explicitly or implicitly
Nick Coghlan27228272012-05-31 22:17:08 +1000468 at the end of a :keyword:`with` statement). Note that callbacks are *not*
469 invoked implicitly when the context stack instance is garbage collected.
Nick Coghlan3267a302012-05-21 22:54:43 +1000470
471 This stack model is used so that context managers that acquire their
472 resources in their ``__init__`` method (such as file objects) can be
473 handled correctly.
474
475 Since registered callbacks are invoked in the reverse order of
Nick Coghlan27228272012-05-31 22:17:08 +1000476 registration, this ends up behaving as if multiple nested :keyword:`with`
Nick Coghlan3267a302012-05-21 22:54:43 +1000477 statements had been used with the registered set of callbacks. This even
478 extends to exception handling - if an inner callback suppresses or replaces
479 an exception, then outer callbacks will be passed arguments based on that
480 updated state.
481
482 This is a relatively low level API that takes care of the details of
483 correctly unwinding the stack of exit callbacks. It provides a suitable
484 foundation for higher level context managers that manipulate the exit
485 stack in application specific ways.
486
Nick Coghlana497b442012-05-22 23:02:00 +1000487 .. versionadded:: 3.3
488
Nick Coghlan3267a302012-05-21 22:54:43 +1000489 .. method:: enter_context(cm)
490
491 Enters a new context manager and adds its :meth:`__exit__` method to
492 the callback stack. The return value is the result of the context
493 manager's own :meth:`__enter__` method.
494
495 These context managers may suppress exceptions just as they normally
Nick Coghlan27228272012-05-31 22:17:08 +1000496 would if used directly as part of a :keyword:`with` statement.
Nick Coghlan3267a302012-05-21 22:54:43 +1000497
498 .. method:: push(exit)
499
500 Adds a context manager's :meth:`__exit__` method to the callback stack.
501
502 As ``__enter__`` is *not* invoked, this method can be used to cover
503 part of an :meth:`__enter__` implementation with a context manager's own
504 :meth:`__exit__` method.
505
506 If passed an object that is not a context manager, this method assumes
507 it is a callback with the same signature as a context manager's
508 :meth:`__exit__` method and adds it directly to the callback stack.
509
510 By returning true values, these callbacks can suppress exceptions the
511 same way context manager :meth:`__exit__` methods can.
512
513 The passed in object is returned from the function, allowing this
Nick Coghlan27228272012-05-31 22:17:08 +1000514 method to be used as a function decorator.
Nick Coghlan3267a302012-05-21 22:54:43 +1000515
Serhiy Storchaka142566c2019-06-05 18:22:31 +0300516 .. method:: callback(callback, /, *args, **kwds)
Nick Coghlan3267a302012-05-21 22:54:43 +1000517
518 Accepts an arbitrary callback function and arguments and adds it to
519 the callback stack.
520
521 Unlike the other methods, callbacks added this way cannot suppress
522 exceptions (as they are never passed the exception details).
523
524 The passed in callback is returned from the function, allowing this
Nick Coghlan27228272012-05-31 22:17:08 +1000525 method to be used as a function decorator.
Nick Coghlan3267a302012-05-21 22:54:43 +1000526
527 .. method:: pop_all()
528
529 Transfers the callback stack to a fresh :class:`ExitStack` instance
530 and returns it. No callbacks are invoked by this operation - instead,
531 they will now be invoked when the new stack is closed (either
Nick Coghlan27228272012-05-31 22:17:08 +1000532 explicitly or implicitly at the end of a :keyword:`with` statement).
Nick Coghlan3267a302012-05-21 22:54:43 +1000533
534 For example, a group of files can be opened as an "all or nothing"
535 operation as follows::
536
537 with ExitStack() as stack:
538 files = [stack.enter_context(open(fname)) for fname in filenames]
Barry Warsawd8f870d2013-05-10 11:35:38 -0400539 # Hold onto the close method, but don't call it yet.
540 close_files = stack.pop_all().close
Nick Coghlan3267a302012-05-21 22:54:43 +1000541 # If opening any file fails, all previously opened files will be
542 # closed automatically. If all files are opened successfully,
543 # they will remain open even after the with statement ends.
Barry Warsawd8f870d2013-05-10 11:35:38 -0400544 # close_files() can then be invoked explicitly to close them all.
Nick Coghlan3267a302012-05-21 22:54:43 +1000545
546 .. method:: close()
547
548 Immediately unwinds the callback stack, invoking callbacks in the
549 reverse order of registration. For any context managers and exit
550 callbacks registered, the arguments passed in will indicate that no
551 exception occurred.
552
Ilya Kulakov1aa094f2018-01-25 12:51:18 -0800553.. class:: AsyncExitStack()
554
555 An :ref:`asynchronous context manager <async-context-managers>`, similar
556 to :class:`ExitStack`, that supports combining both synchronous and
557 asynchronous context managers, as well as having coroutines for
558 cleanup logic.
559
560 The :meth:`close` method is not implemented, :meth:`aclose` must be used
561 instead.
562
563 .. method:: enter_async_context(cm)
564
565 Similar to :meth:`enter_context` but expects an asynchronous context
566 manager.
567
568 .. method:: push_async_exit(exit)
569
570 Similar to :meth:`push` but expects either an asynchronous context manager
Nathaniel J. Smitha3c88ef2018-09-18 14:27:59 -0700571 or a coroutine function.
Ilya Kulakov1aa094f2018-01-25 12:51:18 -0800572
Serhiy Storchaka142566c2019-06-05 18:22:31 +0300573 .. method:: push_async_callback(callback, /, *args, **kwds)
Ilya Kulakov1aa094f2018-01-25 12:51:18 -0800574
Nathaniel J. Smitha3c88ef2018-09-18 14:27:59 -0700575 Similar to :meth:`callback` but expects a coroutine function.
Ilya Kulakov1aa094f2018-01-25 12:51:18 -0800576
577 .. method:: aclose()
578
579 Similar to :meth:`close` but properly handles awaitables.
580
581 Continuing the example for :func:`asynccontextmanager`::
582
583 async with AsyncExitStack() as stack:
584 connections = [await stack.enter_async_context(get_connection())
585 for i in range(5)]
586 # All opened connections will automatically be released at the end of
587 # the async with statement, even if attempts to open a connection
588 # later in the list raise an exception.
589
590 .. versionadded:: 3.7
Nick Coghlan3267a302012-05-21 22:54:43 +1000591
592Examples and Recipes
593--------------------
594
595This section describes some examples and recipes for making effective use of
596the tools provided by :mod:`contextlib`.
597
598
Nick Coghlan27228272012-05-31 22:17:08 +1000599Supporting a variable number of context managers
600^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
601
602The primary use case for :class:`ExitStack` is the one given in the class
603documentation: supporting a variable number of context managers and other
604cleanup operations in a single :keyword:`with` statement. The variability
605may come from the number of context managers needed being driven by user
606input (such as opening a user specified collection of files), or from
607some of the context managers being optional::
608
609 with ExitStack() as stack:
610 for resource in resources:
611 stack.enter_context(resource)
Raymond Hettingere8e2df32014-05-25 18:06:04 -0700612 if need_special_resource():
Nick Coghlan27228272012-05-31 22:17:08 +1000613 special = acquire_special_resource()
614 stack.callback(release_special_resource, special)
615 # Perform operations that use the acquired resources
616
617As shown, :class:`ExitStack` also makes it quite easy to use :keyword:`with`
618statements to manage arbitrary resources that don't natively support the
619context management protocol.
620
621
Nick Coghlan27228272012-05-31 22:17:08 +1000622Catching exceptions from ``__enter__`` methods
623^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
624
625It is occasionally desirable to catch exceptions from an ``__enter__``
626method implementation, *without* inadvertently catching exceptions from
627the :keyword:`with` statement body or the context manager's ``__exit__``
628method. By using :class:`ExitStack` the steps in the context management
629protocol can be separated slightly in order to allow this::
630
631 stack = ExitStack()
632 try:
633 x = stack.enter_context(cm)
634 except Exception:
635 # handle __enter__ exception
636 else:
637 with stack:
638 # Handle normal case
639
640Actually needing to do this is likely to indicate that the underlying API
641should be providing a direct resource management interface for use with
642:keyword:`try`/:keyword:`except`/:keyword:`finally` statements, but not
643all APIs are well designed in that regard. When a context manager is the
644only resource management API provided, then :class:`ExitStack` can make it
645easier to handle various situations that can't be handled directly in a
646:keyword:`with` statement.
647
648
Nick Coghlan3267a302012-05-21 22:54:43 +1000649Cleaning up in an ``__enter__`` implementation
650^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
651
652As noted in the documentation of :meth:`ExitStack.push`, this
653method can be useful in cleaning up an already allocated resource if later
654steps in the :meth:`__enter__` implementation fail.
655
656Here's an example of doing this for a context manager that accepts resource
657acquisition and release functions, along with an optional validation function,
658and maps them to the context management protocol::
659
Brett Cannon9e080e02016-04-08 12:15:27 -0700660 from contextlib import contextmanager, AbstractContextManager, ExitStack
Nick Coghlan3267a302012-05-21 22:54:43 +1000661
Brett Cannon9e080e02016-04-08 12:15:27 -0700662 class ResourceManager(AbstractContextManager):
Nick Coghlan3267a302012-05-21 22:54:43 +1000663
664 def __init__(self, acquire_resource, release_resource, check_resource_ok=None):
665 self.acquire_resource = acquire_resource
666 self.release_resource = release_resource
667 if check_resource_ok is None:
668 def check_resource_ok(resource):
669 return True
670 self.check_resource_ok = check_resource_ok
671
672 @contextmanager
673 def _cleanup_on_error(self):
674 with ExitStack() as stack:
675 stack.push(self)
676 yield
677 # The validation check passed and didn't raise an exception
678 # Accordingly, we want to keep the resource, and pass it
679 # back to our caller
680 stack.pop_all()
681
682 def __enter__(self):
683 resource = self.acquire_resource()
684 with self._cleanup_on_error():
685 if not self.check_resource_ok(resource):
686 msg = "Failed validation for {!r}"
687 raise RuntimeError(msg.format(resource))
688 return resource
689
690 def __exit__(self, *exc_details):
691 # We don't need to duplicate any of our resource release logic
692 self.release_resource()
693
694
695Replacing any use of ``try-finally`` and flag variables
696^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
697
698A pattern you will sometimes see is a ``try-finally`` statement with a flag
699variable to indicate whether or not the body of the ``finally`` clause should
700be executed. In its simplest form (that can't already be handled just by
701using an ``except`` clause instead), it looks something like this::
702
703 cleanup_needed = True
704 try:
705 result = perform_operation()
706 if result:
707 cleanup_needed = False
708 finally:
709 if cleanup_needed:
710 cleanup_resources()
711
712As with any ``try`` statement based code, this can cause problems for
713development and review, because the setup code and the cleanup code can end
714up being separated by arbitrarily long sections of code.
715
716:class:`ExitStack` makes it possible to instead register a callback for
717execution at the end of a ``with`` statement, and then later decide to skip
718executing that callback::
719
720 from contextlib import ExitStack
721
722 with ExitStack() as stack:
723 stack.callback(cleanup_resources)
724 result = perform_operation()
725 if result:
726 stack.pop_all()
727
728This allows the intended cleanup up behaviour to be made explicit up front,
729rather than requiring a separate flag variable.
730
731If a particular application uses this pattern a lot, it can be simplified
732even further by means of a small helper class::
733
734 from contextlib import ExitStack
735
736 class Callback(ExitStack):
Serhiy Storchaka2085bd02019-06-01 11:00:15 +0300737 def __init__(self, callback, /, *args, **kwds):
Nick Coghlan3267a302012-05-21 22:54:43 +1000738 super(Callback, self).__init__()
739 self.callback(callback, *args, **kwds)
740
741 def cancel(self):
742 self.pop_all()
743
744 with Callback(cleanup_resources) as cb:
745 result = perform_operation()
746 if result:
747 cb.cancel()
748
749If the resource cleanup isn't already neatly bundled into a standalone
750function, then it is still possible to use the decorator form of
751:meth:`ExitStack.callback` to declare the resource cleanup in
752advance::
753
754 from contextlib import ExitStack
755
756 with ExitStack() as stack:
757 @stack.callback
758 def cleanup_resources():
759 ...
760 result = perform_operation()
761 if result:
762 stack.pop_all()
763
764Due to the way the decorator protocol works, a callback function
765declared this way cannot take any parameters. Instead, any resources to
Martin Panterd21e0b52015-10-10 10:36:22 +0000766be released must be accessed as closure variables.
Nick Coghlan3267a302012-05-21 22:54:43 +1000767
768
769Using a context manager as a function decorator
770^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
771
772:class:`ContextDecorator` makes it possible to use a context manager in
773both an ordinary ``with`` statement and also as a function decorator.
774
775For example, it is sometimes useful to wrap functions or groups of statements
776with a logger that can track the time of entry and time of exit. Rather than
777writing both a function decorator and a context manager for the task,
778inheriting from :class:`ContextDecorator` provides both capabilities in a
779single definition::
780
781 from contextlib import ContextDecorator
782 import logging
783
784 logging.basicConfig(level=logging.INFO)
785
786 class track_entry_and_exit(ContextDecorator):
787 def __init__(self, name):
788 self.name = name
789
790 def __enter__(self):
Vinay Sajipdd917f82016-08-31 08:22:29 +0100791 logging.info('Entering: %s', self.name)
Nick Coghlan3267a302012-05-21 22:54:43 +1000792
793 def __exit__(self, exc_type, exc, exc_tb):
Vinay Sajipdd917f82016-08-31 08:22:29 +0100794 logging.info('Exiting: %s', self.name)
Nick Coghlan3267a302012-05-21 22:54:43 +1000795
796Instances of this class can be used as both a context manager::
797
798 with track_entry_and_exit('widget loader'):
799 print('Some time consuming activity goes here')
800 load_widget()
801
802And also as a function decorator::
803
804 @track_entry_and_exit('widget loader')
805 def activity():
806 print('Some time consuming activity goes here')
807 load_widget()
808
809Note that there is one additional limitation when using context managers
810as function decorators: there's no way to access the return value of
811:meth:`__enter__`. If that value is needed, then it is still necessary to use
812an explicit ``with`` statement.
813
Georg Brandl116aa622007-08-15 14:28:22 +0000814.. seealso::
815
Serhiy Storchakae4ba8722016-03-31 15:30:54 +0300816 :pep:`343` - The "with" statement
Georg Brandl116aa622007-08-15 14:28:22 +0000817 The specification, background, and examples for the Python :keyword:`with`
818 statement.
819
Nick Coghlan0acceb72013-10-20 13:22:21 +1000820.. _single-use-reusable-and-reentrant-cms:
Nick Coghlan8608d262013-10-20 00:30:51 +1000821
Nick Coghlan0acceb72013-10-20 13:22:21 +1000822Single use, reusable and reentrant context managers
823---------------------------------------------------
Nick Coghlan8608d262013-10-20 00:30:51 +1000824
825Most context managers are written in a way that means they can only be
826used effectively in a :keyword:`with` statement once. These single use
827context managers must be created afresh each time they're used -
828attempting to use them a second time will trigger an exception or
829otherwise not work correctly.
830
831This common limitation means that it is generally advisable to create
832context managers directly in the header of the :keyword:`with` statement
833where they are used (as shown in all of the usage examples above).
834
835Files are an example of effectively single use context managers, since
836the first :keyword:`with` statement will close the file, preventing any
837further IO operations using that file object.
838
839Context managers created using :func:`contextmanager` are also single use
840context managers, and will complain about the underlying generator failing
841to yield if an attempt is made to use them a second time::
842
843 >>> from contextlib import contextmanager
844 >>> @contextmanager
845 ... def singleuse():
846 ... print("Before")
847 ... yield
848 ... print("After")
849 ...
850 >>> cm = singleuse()
851 >>> with cm:
852 ... pass
853 ...
854 Before
855 After
856 >>> with cm:
Serhiy Storchakadba90392016-05-10 12:01:23 +0300857 ... pass
Nick Coghlan8608d262013-10-20 00:30:51 +1000858 ...
859 Traceback (most recent call last):
860 ...
861 RuntimeError: generator didn't yield
862
863
864.. _reentrant-cms:
865
866Reentrant context managers
867^^^^^^^^^^^^^^^^^^^^^^^^^^
868
869More sophisticated context managers may be "reentrant". These context
870managers can not only be used in multiple :keyword:`with` statements,
Serhiy Storchaka2b57c432018-12-19 08:09:46 +0200871but may also be used *inside* a :keyword:`!with` statement that is already
Nick Coghlan8608d262013-10-20 00:30:51 +1000872using the same context manager.
873
Nick Coghlan8e113b42013-11-03 17:00:51 +1000874:class:`threading.RLock` is an example of a reentrant context manager, as are
875:func:`suppress` and :func:`redirect_stdout`. Here's a very simple example of
876reentrant use::
Nick Coghlan8608d262013-10-20 00:30:51 +1000877
Nick Coghlan8e113b42013-11-03 17:00:51 +1000878 >>> from contextlib import redirect_stdout
879 >>> from io import StringIO
880 >>> stream = StringIO()
881 >>> write_to_stream = redirect_stdout(stream)
882 >>> with write_to_stream:
883 ... print("This is written to the stream rather than stdout")
884 ... with write_to_stream:
885 ... print("This is also written to the stream")
Nick Coghlan8608d262013-10-20 00:30:51 +1000886 ...
Nick Coghlan8e113b42013-11-03 17:00:51 +1000887 >>> print("This is written directly to stdout")
888 This is written directly to stdout
889 >>> print(stream.getvalue())
890 This is written to the stream rather than stdout
891 This is also written to the stream
892
893Real world examples of reentrancy are more likely to involve multiple
894functions calling each other and hence be far more complicated than this
895example.
896
897Note also that being reentrant is *not* the same thing as being thread safe.
898:func:`redirect_stdout`, for example, is definitely not thread safe, as it
899makes a global modification to the system state by binding :data:`sys.stdout`
900to a different stream.
Nick Coghlan8608d262013-10-20 00:30:51 +1000901
902
903.. _reusable-cms:
904
905Reusable context managers
906^^^^^^^^^^^^^^^^^^^^^^^^^
907
908Distinct from both single use and reentrant context managers are "reusable"
909context managers (or, to be completely explicit, "reusable, but not
910reentrant" context managers, since reentrant context managers are also
911reusable). These context managers support being used multiple times, but
912will fail (or otherwise not work correctly) if the specific context manager
913instance has already been used in a containing with statement.
914
Nick Coghlan8e113b42013-11-03 17:00:51 +1000915:class:`threading.Lock` is an example of a reusable, but not reentrant,
916context manager (for a reentrant lock, it is necessary to use
917:class:`threading.RLock` instead).
Nick Coghlan8608d262013-10-20 00:30:51 +1000918
Nick Coghlan8e113b42013-11-03 17:00:51 +1000919Another example of a reusable, but not reentrant, context manager is
920:class:`ExitStack`, as it invokes *all* currently registered callbacks
921when leaving any with statement, regardless of where those callbacks
922were added::
Nick Coghlan8608d262013-10-20 00:30:51 +1000923
Nick Coghlan8e113b42013-11-03 17:00:51 +1000924 >>> from contextlib import ExitStack
925 >>> stack = ExitStack()
926 >>> with stack:
927 ... stack.callback(print, "Callback: from first context")
928 ... print("Leaving first context")
Nick Coghlan8608d262013-10-20 00:30:51 +1000929 ...
Nick Coghlan8e113b42013-11-03 17:00:51 +1000930 Leaving first context
931 Callback: from first context
932 >>> with stack:
933 ... stack.callback(print, "Callback: from second context")
934 ... print("Leaving second context")
935 ...
936 Leaving second context
937 Callback: from second context
938 >>> with stack:
939 ... stack.callback(print, "Callback: from outer context")
940 ... with stack:
941 ... stack.callback(print, "Callback: from inner context")
942 ... print("Leaving inner context")
943 ... print("Leaving outer context")
944 ...
945 Leaving inner context
946 Callback: from inner context
947 Callback: from outer context
948 Leaving outer context
949
950As the output from the example shows, reusing a single stack object across
951multiple with statements works correctly, but attempting to nest them
952will cause the stack to be cleared at the end of the innermost with
953statement, which is unlikely to be desirable behaviour.
954
955Using separate :class:`ExitStack` instances instead of reusing a single
956instance avoids that problem::
957
958 >>> from contextlib import ExitStack
959 >>> with ExitStack() as outer_stack:
960 ... outer_stack.callback(print, "Callback: from outer context")
961 ... with ExitStack() as inner_stack:
962 ... inner_stack.callback(print, "Callback: from inner context")
963 ... print("Leaving inner context")
964 ... print("Leaving outer context")
965 ...
966 Leaving inner context
967 Callback: from inner context
968 Leaving outer context
969 Callback: from outer context