blob: ee2becb8dff20deb5f11a241bc37c68698943c2f [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
Kazantcev Andrey178695b2020-11-05 11:52:24 +0300412.. class:: AsyncContextManager
413
414 Similar as ContextManger only for async
415
416 Example of ``ContextDecorator``::
417
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
448
Nick Coghlan3267a302012-05-21 22:54:43 +1000449.. class:: ExitStack()
450
451 A context manager that is designed to make it easy to programmatically
452 combine other context managers and cleanup functions, especially those
453 that are optional or otherwise driven by input data.
454
455 For example, a set of files may easily be handled in a single with
456 statement as follows::
457
458 with ExitStack() as stack:
459 files = [stack.enter_context(open(fname)) for fname in filenames]
460 # All opened files will automatically be closed at the end of
461 # the with statement, even if attempts to open files later
Andrew Svetlov5b898402012-12-18 21:26:36 +0200462 # in the list raise an exception
Nick Coghlan3267a302012-05-21 22:54:43 +1000463
464 Each instance maintains a stack of registered callbacks that are called in
465 reverse order when the instance is closed (either explicitly or implicitly
Nick Coghlan27228272012-05-31 22:17:08 +1000466 at the end of a :keyword:`with` statement). Note that callbacks are *not*
467 invoked implicitly when the context stack instance is garbage collected.
Nick Coghlan3267a302012-05-21 22:54:43 +1000468
469 This stack model is used so that context managers that acquire their
470 resources in their ``__init__`` method (such as file objects) can be
471 handled correctly.
472
473 Since registered callbacks are invoked in the reverse order of
Nick Coghlan27228272012-05-31 22:17:08 +1000474 registration, this ends up behaving as if multiple nested :keyword:`with`
Nick Coghlan3267a302012-05-21 22:54:43 +1000475 statements had been used with the registered set of callbacks. This even
476 extends to exception handling - if an inner callback suppresses or replaces
477 an exception, then outer callbacks will be passed arguments based on that
478 updated state.
479
480 This is a relatively low level API that takes care of the details of
481 correctly unwinding the stack of exit callbacks. It provides a suitable
482 foundation for higher level context managers that manipulate the exit
483 stack in application specific ways.
484
Nick Coghlana497b442012-05-22 23:02:00 +1000485 .. versionadded:: 3.3
486
Nick Coghlan3267a302012-05-21 22:54:43 +1000487 .. method:: enter_context(cm)
488
489 Enters a new context manager and adds its :meth:`__exit__` method to
490 the callback stack. The return value is the result of the context
491 manager's own :meth:`__enter__` method.
492
493 These context managers may suppress exceptions just as they normally
Nick Coghlan27228272012-05-31 22:17:08 +1000494 would if used directly as part of a :keyword:`with` statement.
Nick Coghlan3267a302012-05-21 22:54:43 +1000495
496 .. method:: push(exit)
497
498 Adds a context manager's :meth:`__exit__` method to the callback stack.
499
500 As ``__enter__`` is *not* invoked, this method can be used to cover
501 part of an :meth:`__enter__` implementation with a context manager's own
502 :meth:`__exit__` method.
503
504 If passed an object that is not a context manager, this method assumes
505 it is a callback with the same signature as a context manager's
506 :meth:`__exit__` method and adds it directly to the callback stack.
507
508 By returning true values, these callbacks can suppress exceptions the
509 same way context manager :meth:`__exit__` methods can.
510
511 The passed in object is returned from the function, allowing this
Nick Coghlan27228272012-05-31 22:17:08 +1000512 method to be used as a function decorator.
Nick Coghlan3267a302012-05-21 22:54:43 +1000513
Serhiy Storchaka142566c2019-06-05 18:22:31 +0300514 .. method:: callback(callback, /, *args, **kwds)
Nick Coghlan3267a302012-05-21 22:54:43 +1000515
516 Accepts an arbitrary callback function and arguments and adds it to
517 the callback stack.
518
519 Unlike the other methods, callbacks added this way cannot suppress
520 exceptions (as they are never passed the exception details).
521
522 The passed in callback is returned from the function, allowing this
Nick Coghlan27228272012-05-31 22:17:08 +1000523 method to be used as a function decorator.
Nick Coghlan3267a302012-05-21 22:54:43 +1000524
525 .. method:: pop_all()
526
527 Transfers the callback stack to a fresh :class:`ExitStack` instance
528 and returns it. No callbacks are invoked by this operation - instead,
529 they will now be invoked when the new stack is closed (either
Nick Coghlan27228272012-05-31 22:17:08 +1000530 explicitly or implicitly at the end of a :keyword:`with` statement).
Nick Coghlan3267a302012-05-21 22:54:43 +1000531
532 For example, a group of files can be opened as an "all or nothing"
533 operation as follows::
534
535 with ExitStack() as stack:
536 files = [stack.enter_context(open(fname)) for fname in filenames]
Barry Warsawd8f870d2013-05-10 11:35:38 -0400537 # Hold onto the close method, but don't call it yet.
538 close_files = stack.pop_all().close
Nick Coghlan3267a302012-05-21 22:54:43 +1000539 # If opening any file fails, all previously opened files will be
540 # closed automatically. If all files are opened successfully,
541 # they will remain open even after the with statement ends.
Barry Warsawd8f870d2013-05-10 11:35:38 -0400542 # close_files() can then be invoked explicitly to close them all.
Nick Coghlan3267a302012-05-21 22:54:43 +1000543
544 .. method:: close()
545
546 Immediately unwinds the callback stack, invoking callbacks in the
547 reverse order of registration. For any context managers and exit
548 callbacks registered, the arguments passed in will indicate that no
549 exception occurred.
550
Ilya Kulakov1aa094f2018-01-25 12:51:18 -0800551.. class:: AsyncExitStack()
552
553 An :ref:`asynchronous context manager <async-context-managers>`, similar
554 to :class:`ExitStack`, that supports combining both synchronous and
555 asynchronous context managers, as well as having coroutines for
556 cleanup logic.
557
558 The :meth:`close` method is not implemented, :meth:`aclose` must be used
559 instead.
560
561 .. method:: enter_async_context(cm)
562
563 Similar to :meth:`enter_context` but expects an asynchronous context
564 manager.
565
566 .. method:: push_async_exit(exit)
567
568 Similar to :meth:`push` but expects either an asynchronous context manager
Nathaniel J. Smitha3c88ef2018-09-18 14:27:59 -0700569 or a coroutine function.
Ilya Kulakov1aa094f2018-01-25 12:51:18 -0800570
Serhiy Storchaka142566c2019-06-05 18:22:31 +0300571 .. method:: push_async_callback(callback, /, *args, **kwds)
Ilya Kulakov1aa094f2018-01-25 12:51:18 -0800572
Nathaniel J. Smitha3c88ef2018-09-18 14:27:59 -0700573 Similar to :meth:`callback` but expects a coroutine function.
Ilya Kulakov1aa094f2018-01-25 12:51:18 -0800574
575 .. method:: aclose()
576
577 Similar to :meth:`close` but properly handles awaitables.
578
579 Continuing the example for :func:`asynccontextmanager`::
580
581 async with AsyncExitStack() as stack:
582 connections = [await stack.enter_async_context(get_connection())
583 for i in range(5)]
584 # All opened connections will automatically be released at the end of
585 # the async with statement, even if attempts to open a connection
586 # later in the list raise an exception.
587
588 .. versionadded:: 3.7
Nick Coghlan3267a302012-05-21 22:54:43 +1000589
590Examples and Recipes
591--------------------
592
593This section describes some examples and recipes for making effective use of
594the tools provided by :mod:`contextlib`.
595
596
Nick Coghlan27228272012-05-31 22:17:08 +1000597Supporting a variable number of context managers
598^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
599
600The primary use case for :class:`ExitStack` is the one given in the class
601documentation: supporting a variable number of context managers and other
602cleanup operations in a single :keyword:`with` statement. The variability
603may come from the number of context managers needed being driven by user
604input (such as opening a user specified collection of files), or from
605some of the context managers being optional::
606
607 with ExitStack() as stack:
608 for resource in resources:
609 stack.enter_context(resource)
Raymond Hettingere8e2df32014-05-25 18:06:04 -0700610 if need_special_resource():
Nick Coghlan27228272012-05-31 22:17:08 +1000611 special = acquire_special_resource()
612 stack.callback(release_special_resource, special)
613 # Perform operations that use the acquired resources
614
615As shown, :class:`ExitStack` also makes it quite easy to use :keyword:`with`
616statements to manage arbitrary resources that don't natively support the
617context management protocol.
618
619
Nick Coghlan27228272012-05-31 22:17:08 +1000620Catching exceptions from ``__enter__`` methods
621^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
622
623It is occasionally desirable to catch exceptions from an ``__enter__``
624method implementation, *without* inadvertently catching exceptions from
625the :keyword:`with` statement body or the context manager's ``__exit__``
626method. By using :class:`ExitStack` the steps in the context management
627protocol can be separated slightly in order to allow this::
628
629 stack = ExitStack()
630 try:
631 x = stack.enter_context(cm)
632 except Exception:
633 # handle __enter__ exception
634 else:
635 with stack:
636 # Handle normal case
637
638Actually needing to do this is likely to indicate that the underlying API
639should be providing a direct resource management interface for use with
640:keyword:`try`/:keyword:`except`/:keyword:`finally` statements, but not
641all APIs are well designed in that regard. When a context manager is the
642only resource management API provided, then :class:`ExitStack` can make it
643easier to handle various situations that can't be handled directly in a
644:keyword:`with` statement.
645
646
Nick Coghlan3267a302012-05-21 22:54:43 +1000647Cleaning up in an ``__enter__`` implementation
648^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
649
650As noted in the documentation of :meth:`ExitStack.push`, this
651method can be useful in cleaning up an already allocated resource if later
652steps in the :meth:`__enter__` implementation fail.
653
654Here's an example of doing this for a context manager that accepts resource
655acquisition and release functions, along with an optional validation function,
656and maps them to the context management protocol::
657
Brett Cannon9e080e02016-04-08 12:15:27 -0700658 from contextlib import contextmanager, AbstractContextManager, ExitStack
Nick Coghlan3267a302012-05-21 22:54:43 +1000659
Brett Cannon9e080e02016-04-08 12:15:27 -0700660 class ResourceManager(AbstractContextManager):
Nick Coghlan3267a302012-05-21 22:54:43 +1000661
662 def __init__(self, acquire_resource, release_resource, check_resource_ok=None):
663 self.acquire_resource = acquire_resource
664 self.release_resource = release_resource
665 if check_resource_ok is None:
666 def check_resource_ok(resource):
667 return True
668 self.check_resource_ok = check_resource_ok
669
670 @contextmanager
671 def _cleanup_on_error(self):
672 with ExitStack() as stack:
673 stack.push(self)
674 yield
675 # The validation check passed and didn't raise an exception
676 # Accordingly, we want to keep the resource, and pass it
677 # back to our caller
678 stack.pop_all()
679
680 def __enter__(self):
681 resource = self.acquire_resource()
682 with self._cleanup_on_error():
683 if not self.check_resource_ok(resource):
684 msg = "Failed validation for {!r}"
685 raise RuntimeError(msg.format(resource))
686 return resource
687
688 def __exit__(self, *exc_details):
689 # We don't need to duplicate any of our resource release logic
690 self.release_resource()
691
692
693Replacing any use of ``try-finally`` and flag variables
694^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
695
696A pattern you will sometimes see is a ``try-finally`` statement with a flag
697variable to indicate whether or not the body of the ``finally`` clause should
698be executed. In its simplest form (that can't already be handled just by
699using an ``except`` clause instead), it looks something like this::
700
701 cleanup_needed = True
702 try:
703 result = perform_operation()
704 if result:
705 cleanup_needed = False
706 finally:
707 if cleanup_needed:
708 cleanup_resources()
709
710As with any ``try`` statement based code, this can cause problems for
711development and review, because the setup code and the cleanup code can end
712up being separated by arbitrarily long sections of code.
713
714:class:`ExitStack` makes it possible to instead register a callback for
715execution at the end of a ``with`` statement, and then later decide to skip
716executing that callback::
717
718 from contextlib import ExitStack
719
720 with ExitStack() as stack:
721 stack.callback(cleanup_resources)
722 result = perform_operation()
723 if result:
724 stack.pop_all()
725
726This allows the intended cleanup up behaviour to be made explicit up front,
727rather than requiring a separate flag variable.
728
729If a particular application uses this pattern a lot, it can be simplified
730even further by means of a small helper class::
731
732 from contextlib import ExitStack
733
734 class Callback(ExitStack):
Serhiy Storchaka2085bd02019-06-01 11:00:15 +0300735 def __init__(self, callback, /, *args, **kwds):
Nick Coghlan3267a302012-05-21 22:54:43 +1000736 super(Callback, self).__init__()
737 self.callback(callback, *args, **kwds)
738
739 def cancel(self):
740 self.pop_all()
741
742 with Callback(cleanup_resources) as cb:
743 result = perform_operation()
744 if result:
745 cb.cancel()
746
747If the resource cleanup isn't already neatly bundled into a standalone
748function, then it is still possible to use the decorator form of
749:meth:`ExitStack.callback` to declare the resource cleanup in
750advance::
751
752 from contextlib import ExitStack
753
754 with ExitStack() as stack:
755 @stack.callback
756 def cleanup_resources():
757 ...
758 result = perform_operation()
759 if result:
760 stack.pop_all()
761
762Due to the way the decorator protocol works, a callback function
763declared this way cannot take any parameters. Instead, any resources to
Martin Panterd21e0b52015-10-10 10:36:22 +0000764be released must be accessed as closure variables.
Nick Coghlan3267a302012-05-21 22:54:43 +1000765
766
767Using a context manager as a function decorator
768^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
769
770:class:`ContextDecorator` makes it possible to use a context manager in
771both an ordinary ``with`` statement and also as a function decorator.
772
773For example, it is sometimes useful to wrap functions or groups of statements
774with a logger that can track the time of entry and time of exit. Rather than
775writing both a function decorator and a context manager for the task,
776inheriting from :class:`ContextDecorator` provides both capabilities in a
777single definition::
778
779 from contextlib import ContextDecorator
780 import logging
781
782 logging.basicConfig(level=logging.INFO)
783
784 class track_entry_and_exit(ContextDecorator):
785 def __init__(self, name):
786 self.name = name
787
788 def __enter__(self):
Vinay Sajipdd917f82016-08-31 08:22:29 +0100789 logging.info('Entering: %s', self.name)
Nick Coghlan3267a302012-05-21 22:54:43 +1000790
791 def __exit__(self, exc_type, exc, exc_tb):
Vinay Sajipdd917f82016-08-31 08:22:29 +0100792 logging.info('Exiting: %s', self.name)
Nick Coghlan3267a302012-05-21 22:54:43 +1000793
794Instances of this class can be used as both a context manager::
795
796 with track_entry_and_exit('widget loader'):
797 print('Some time consuming activity goes here')
798 load_widget()
799
800And also as a function decorator::
801
802 @track_entry_and_exit('widget loader')
803 def activity():
804 print('Some time consuming activity goes here')
805 load_widget()
806
807Note that there is one additional limitation when using context managers
808as function decorators: there's no way to access the return value of
809:meth:`__enter__`. If that value is needed, then it is still necessary to use
810an explicit ``with`` statement.
811
Georg Brandl116aa622007-08-15 14:28:22 +0000812.. seealso::
813
Serhiy Storchakae4ba8722016-03-31 15:30:54 +0300814 :pep:`343` - The "with" statement
Georg Brandl116aa622007-08-15 14:28:22 +0000815 The specification, background, and examples for the Python :keyword:`with`
816 statement.
817
Nick Coghlan0acceb72013-10-20 13:22:21 +1000818.. _single-use-reusable-and-reentrant-cms:
Nick Coghlan8608d262013-10-20 00:30:51 +1000819
Nick Coghlan0acceb72013-10-20 13:22:21 +1000820Single use, reusable and reentrant context managers
821---------------------------------------------------
Nick Coghlan8608d262013-10-20 00:30:51 +1000822
823Most context managers are written in a way that means they can only be
824used effectively in a :keyword:`with` statement once. These single use
825context managers must be created afresh each time they're used -
826attempting to use them a second time will trigger an exception or
827otherwise not work correctly.
828
829This common limitation means that it is generally advisable to create
830context managers directly in the header of the :keyword:`with` statement
831where they are used (as shown in all of the usage examples above).
832
833Files are an example of effectively single use context managers, since
834the first :keyword:`with` statement will close the file, preventing any
835further IO operations using that file object.
836
837Context managers created using :func:`contextmanager` are also single use
838context managers, and will complain about the underlying generator failing
839to yield if an attempt is made to use them a second time::
840
841 >>> from contextlib import contextmanager
842 >>> @contextmanager
843 ... def singleuse():
844 ... print("Before")
845 ... yield
846 ... print("After")
847 ...
848 >>> cm = singleuse()
849 >>> with cm:
850 ... pass
851 ...
852 Before
853 After
854 >>> with cm:
Serhiy Storchakadba90392016-05-10 12:01:23 +0300855 ... pass
Nick Coghlan8608d262013-10-20 00:30:51 +1000856 ...
857 Traceback (most recent call last):
858 ...
859 RuntimeError: generator didn't yield
860
861
862.. _reentrant-cms:
863
864Reentrant context managers
865^^^^^^^^^^^^^^^^^^^^^^^^^^
866
867More sophisticated context managers may be "reentrant". These context
868managers can not only be used in multiple :keyword:`with` statements,
Serhiy Storchaka2b57c432018-12-19 08:09:46 +0200869but may also be used *inside* a :keyword:`!with` statement that is already
Nick Coghlan8608d262013-10-20 00:30:51 +1000870using the same context manager.
871
Nick Coghlan8e113b42013-11-03 17:00:51 +1000872:class:`threading.RLock` is an example of a reentrant context manager, as are
873:func:`suppress` and :func:`redirect_stdout`. Here's a very simple example of
874reentrant use::
Nick Coghlan8608d262013-10-20 00:30:51 +1000875
Nick Coghlan8e113b42013-11-03 17:00:51 +1000876 >>> from contextlib import redirect_stdout
877 >>> from io import StringIO
878 >>> stream = StringIO()
879 >>> write_to_stream = redirect_stdout(stream)
880 >>> with write_to_stream:
881 ... print("This is written to the stream rather than stdout")
882 ... with write_to_stream:
883 ... print("This is also written to the stream")
Nick Coghlan8608d262013-10-20 00:30:51 +1000884 ...
Nick Coghlan8e113b42013-11-03 17:00:51 +1000885 >>> print("This is written directly to stdout")
886 This is written directly to stdout
887 >>> print(stream.getvalue())
888 This is written to the stream rather than stdout
889 This is also written to the stream
890
891Real world examples of reentrancy are more likely to involve multiple
892functions calling each other and hence be far more complicated than this
893example.
894
895Note also that being reentrant is *not* the same thing as being thread safe.
896:func:`redirect_stdout`, for example, is definitely not thread safe, as it
897makes a global modification to the system state by binding :data:`sys.stdout`
898to a different stream.
Nick Coghlan8608d262013-10-20 00:30:51 +1000899
900
901.. _reusable-cms:
902
903Reusable context managers
904^^^^^^^^^^^^^^^^^^^^^^^^^
905
906Distinct from both single use and reentrant context managers are "reusable"
907context managers (or, to be completely explicit, "reusable, but not
908reentrant" context managers, since reentrant context managers are also
909reusable). These context managers support being used multiple times, but
910will fail (or otherwise not work correctly) if the specific context manager
911instance has already been used in a containing with statement.
912
Nick Coghlan8e113b42013-11-03 17:00:51 +1000913:class:`threading.Lock` is an example of a reusable, but not reentrant,
914context manager (for a reentrant lock, it is necessary to use
915:class:`threading.RLock` instead).
Nick Coghlan8608d262013-10-20 00:30:51 +1000916
Nick Coghlan8e113b42013-11-03 17:00:51 +1000917Another example of a reusable, but not reentrant, context manager is
918:class:`ExitStack`, as it invokes *all* currently registered callbacks
919when leaving any with statement, regardless of where those callbacks
920were added::
Nick Coghlan8608d262013-10-20 00:30:51 +1000921
Nick Coghlan8e113b42013-11-03 17:00:51 +1000922 >>> from contextlib import ExitStack
923 >>> stack = ExitStack()
924 >>> with stack:
925 ... stack.callback(print, "Callback: from first context")
926 ... print("Leaving first context")
Nick Coghlan8608d262013-10-20 00:30:51 +1000927 ...
Nick Coghlan8e113b42013-11-03 17:00:51 +1000928 Leaving first context
929 Callback: from first context
930 >>> with stack:
931 ... stack.callback(print, "Callback: from second context")
932 ... print("Leaving second context")
933 ...
934 Leaving second context
935 Callback: from second context
936 >>> with stack:
937 ... stack.callback(print, "Callback: from outer context")
938 ... with stack:
939 ... stack.callback(print, "Callback: from inner context")
940 ... print("Leaving inner context")
941 ... print("Leaving outer context")
942 ...
943 Leaving inner context
944 Callback: from inner context
945 Callback: from outer context
946 Leaving outer context
947
948As the output from the example shows, reusing a single stack object across
949multiple with statements works correctly, but attempting to nest them
950will cause the stack to be cleared at the end of the innermost with
951statement, which is unlikely to be desirable behaviour.
952
953Using separate :class:`ExitStack` instances instead of reusing a single
954instance avoids that problem::
955
956 >>> from contextlib import ExitStack
957 >>> with ExitStack() as outer_stack:
958 ... outer_stack.callback(print, "Callback: from outer context")
959 ... with ExitStack() as inner_stack:
960 ... inner_stack.callback(print, "Callback: from inner context")
961 ... print("Leaving inner context")
962 ... print("Leaving outer context")
963 ...
964 Leaving inner context
965 Callback: from inner context
966 Leaving outer context
967 Callback: from outer context