blob: 91edbba72834720e69287020a88367992e2525a8 [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
Tom Gringauza1171672020-11-09 14:34:07 +0200246 It can also be used as a stand-in for
247 :ref:`asynchronous context managers <async-context-managers>`::
248
249 async def send_http(session=None):
250 if not session:
251 # If no http session, create it with aiohttp
252 cm = aiohttp.ClientSession()
253 else:
254 # Caller is responsible for closing the session
255 cm = nullcontext(session)
256
257 async with cm as session:
258 # Send http requests with session
259
Jesse-Bakker0784a2e2017-11-23 01:23:28 +0100260 .. versionadded:: 3.7
261
Tom Gringauza1171672020-11-09 14:34:07 +0200262 .. versionchanged:: 3.10
263 :term:`asynchronous context manager` support was added.
264
265
Jesse-Bakker0784a2e2017-11-23 01:23:28 +0100266
Nick Coghlan240f86d2013-10-17 23:40:57 +1000267.. function:: suppress(*exceptions)
Raymond Hettingere318a882013-03-10 22:26:51 -0700268
Nick Coghlan240f86d2013-10-17 23:40:57 +1000269 Return a context manager that suppresses any of the specified exceptions
270 if they occur in the body of a with statement and then resumes execution
271 with the first statement following the end of the with statement.
Raymond Hettingere318a882013-03-10 22:26:51 -0700272
Nick Coghlan240f86d2013-10-17 23:40:57 +1000273 As with any other mechanism that completely suppresses exceptions, this
274 context manager should be used only to cover very specific errors where
275 silently continuing with program execution is known to be the right
276 thing to do.
Nick Coghlanb4534ae2013-10-13 23:23:08 +1000277
Raymond Hettingere318a882013-03-10 22:26:51 -0700278 For example::
279
Nick Coghlan240f86d2013-10-17 23:40:57 +1000280 from contextlib import suppress
Raymond Hettingere318a882013-03-10 22:26:51 -0700281
Nick Coghlan240f86d2013-10-17 23:40:57 +1000282 with suppress(FileNotFoundError):
Raymond Hettingere318a882013-03-10 22:26:51 -0700283 os.remove('somefile.tmp')
284
Nick Coghlan240f86d2013-10-17 23:40:57 +1000285 with suppress(FileNotFoundError):
286 os.remove('someotherfile.tmp')
287
Raymond Hettingere318a882013-03-10 22:26:51 -0700288 This code is equivalent to::
289
290 try:
291 os.remove('somefile.tmp')
Nick Coghlanb4534ae2013-10-13 23:23:08 +1000292 except FileNotFoundError:
Raymond Hettingere318a882013-03-10 22:26:51 -0700293 pass
294
Nick Coghlan240f86d2013-10-17 23:40:57 +1000295 try:
296 os.remove('someotherfile.tmp')
297 except FileNotFoundError:
298 pass
299
Nick Coghlan8608d262013-10-20 00:30:51 +1000300 This context manager is :ref:`reentrant <reentrant-cms>`.
301
Raymond Hettingere318a882013-03-10 22:26:51 -0700302 .. versionadded:: 3.4
Georg Brandl116aa622007-08-15 14:28:22 +0000303
Nick Coghlanb4534ae2013-10-13 23:23:08 +1000304
Raymond Hettinger088cbf22013-10-10 00:46:57 -0700305.. function:: redirect_stdout(new_target)
306
307 Context manager for temporarily redirecting :data:`sys.stdout` to
308 another file or file-like object.
309
310 This tool adds flexibility to existing functions or classes whose output
311 is hardwired to stdout.
312
313 For example, the output of :func:`help` normally is sent to *sys.stdout*.
Serhiy Storchakad65c9492015-11-02 14:10:23 +0200314 You can capture that output in a string by redirecting the output to an
Raymond Hettinger088cbf22013-10-10 00:46:57 -0700315 :class:`io.StringIO` object::
316
317 f = io.StringIO()
318 with redirect_stdout(f):
319 help(pow)
320 s = f.getvalue()
321
322 To send the output of :func:`help` to a file on disk, redirect the output
323 to a regular file::
324
325 with open('help.txt', 'w') as f:
326 with redirect_stdout(f):
327 help(pow)
328
329 To send the output of :func:`help` to *sys.stderr*::
330
331 with redirect_stdout(sys.stderr):
332 help(pow)
333
Nick Coghlanb4534ae2013-10-13 23:23:08 +1000334 Note that the global side effect on :data:`sys.stdout` means that this
335 context manager is not suitable for use in library code and most threaded
336 applications. It also has no effect on the output of subprocesses.
337 However, it is still a useful approach for many utility scripts.
338
Nick Coghlan36d8ef92014-10-12 10:25:00 +1000339 This context manager is :ref:`reentrant <reentrant-cms>`.
Nick Coghlan8608d262013-10-20 00:30:51 +1000340
Raymond Hettinger088cbf22013-10-10 00:46:57 -0700341 .. versionadded:: 3.4
342
Georg Brandla7c17e52013-10-13 22:25:10 +0200343
Berker Peksagbb44fe02014-11-28 23:28:06 +0200344.. function:: redirect_stderr(new_target)
345
346 Similar to :func:`~contextlib.redirect_stdout` but redirecting
347 :data:`sys.stderr` to another file or file-like object.
348
349 This context manager is :ref:`reentrant <reentrant-cms>`.
350
351 .. versionadded:: 3.5
352
353
Michael Foordb3a89842010-06-30 12:17:50 +0000354.. class:: ContextDecorator()
355
356 A base class that enables a context manager to also be used as a decorator.
357
358 Context managers inheriting from ``ContextDecorator`` have to implement
359 ``__enter__`` and ``__exit__`` as normal. ``__exit__`` retains its optional
360 exception handling even when used as a decorator.
361
Georg Brandl86e78d12010-07-18 13:43:32 +0000362 ``ContextDecorator`` is used by :func:`contextmanager`, so you get this
363 functionality automatically.
364
365 Example of ``ContextDecorator``::
Michael Foordb3a89842010-06-30 12:17:50 +0000366
367 from contextlib import ContextDecorator
368
369 class mycontext(ContextDecorator):
Georg Brandl86e78d12010-07-18 13:43:32 +0000370 def __enter__(self):
371 print('Starting')
372 return self
Michael Foordb3a89842010-06-30 12:17:50 +0000373
Georg Brandl86e78d12010-07-18 13:43:32 +0000374 def __exit__(self, *exc):
375 print('Finishing')
376 return False
Michael Foordb3a89842010-06-30 12:17:50 +0000377
378 >>> @mycontext()
379 ... def function():
Georg Brandl86e78d12010-07-18 13:43:32 +0000380 ... print('The bit in the middle')
Michael Foordb3a89842010-06-30 12:17:50 +0000381 ...
382 >>> function()
383 Starting
384 The bit in the middle
385 Finishing
386
387 >>> with mycontext():
Georg Brandl86e78d12010-07-18 13:43:32 +0000388 ... print('The bit in the middle')
Michael Foordb3a89842010-06-30 12:17:50 +0000389 ...
390 Starting
391 The bit in the middle
392 Finishing
393
Georg Brandl86e78d12010-07-18 13:43:32 +0000394 This change is just syntactic sugar for any construct of the following form::
395
396 def f():
397 with cm():
398 # Do stuff
399
400 ``ContextDecorator`` lets you instead write::
401
402 @cm()
403 def f():
404 # Do stuff
405
406 It makes it clear that the ``cm`` applies to the whole function, rather than
407 just a piece of it (and saving an indentation level is nice, too).
408
Michael Foordb3a89842010-06-30 12:17:50 +0000409 Existing context managers that already have a base class can be extended by
410 using ``ContextDecorator`` as a mixin class::
411
412 from contextlib import ContextDecorator
413
414 class mycontext(ContextBaseClass, ContextDecorator):
Georg Brandl86e78d12010-07-18 13:43:32 +0000415 def __enter__(self):
416 return self
Michael Foordb3a89842010-06-30 12:17:50 +0000417
Georg Brandl86e78d12010-07-18 13:43:32 +0000418 def __exit__(self, *exc):
419 return False
Michael Foordb3a89842010-06-30 12:17:50 +0000420
Nick Coghlan0ded3e32011-05-05 23:49:25 +1000421 .. note::
422 As the decorated function must be able to be called multiple times, the
423 underlying context manager must support use in multiple :keyword:`with`
424 statements. If this is not the case, then the original construct with the
Serhiy Storchaka2b57c432018-12-19 08:09:46 +0200425 explicit :keyword:`!with` statement inside the function should be used.
Nick Coghlan0ded3e32011-05-05 23:49:25 +1000426
Michael Foordb3a89842010-06-30 12:17:50 +0000427 .. versionadded:: 3.2
428
429
kj133aa2d2020-11-06 00:16:27 +0800430.. class:: AsyncContextDecorator
Kazantcev Andrey178695b2020-11-05 11:52:24 +0300431
kj133aa2d2020-11-06 00:16:27 +0800432 Similar to :class:`ContextDecorator` but only for asynchronous functions.
Kazantcev Andrey178695b2020-11-05 11:52:24 +0300433
kj133aa2d2020-11-06 00:16:27 +0800434 Example of ``AsyncContextDecorator``::
Kazantcev Andrey178695b2020-11-05 11:52:24 +0300435
436 from asyncio import run
437 from contextlib import AsyncContextDecorator
438
439 class mycontext(AsyncContextDecorator):
440 async def __aenter__(self):
441 print('Starting')
442 return self
443
444 async def __aexit__(self, *exc):
445 print('Finishing')
446 return False
447
448 >>> @mycontext()
449 ... async def function():
450 ... print('The bit in the middle')
451 ...
452 >>> run(function())
453 Starting
454 The bit in the middle
455 Finishing
456
457 >>> async def function():
458 ... async with mycontext():
459 ... print('The bit in the middle')
460 ...
461 >>> run(function())
462 Starting
463 The bit in the middle
464 Finishing
465
kj133aa2d2020-11-06 00:16:27 +0800466 .. versionadded:: 3.10
467
Kazantcev Andrey178695b2020-11-05 11:52:24 +0300468
Nick Coghlan3267a302012-05-21 22:54:43 +1000469.. class:: ExitStack()
470
471 A context manager that is designed to make it easy to programmatically
472 combine other context managers and cleanup functions, especially those
473 that are optional or otherwise driven by input data.
474
475 For example, a set of files may easily be handled in a single with
476 statement as follows::
477
478 with ExitStack() as stack:
479 files = [stack.enter_context(open(fname)) for fname in filenames]
480 # All opened files will automatically be closed at the end of
481 # the with statement, even if attempts to open files later
Andrew Svetlov5b898402012-12-18 21:26:36 +0200482 # in the list raise an exception
Nick Coghlan3267a302012-05-21 22:54:43 +1000483
484 Each instance maintains a stack of registered callbacks that are called in
485 reverse order when the instance is closed (either explicitly or implicitly
Nick Coghlan27228272012-05-31 22:17:08 +1000486 at the end of a :keyword:`with` statement). Note that callbacks are *not*
487 invoked implicitly when the context stack instance is garbage collected.
Nick Coghlan3267a302012-05-21 22:54:43 +1000488
489 This stack model is used so that context managers that acquire their
490 resources in their ``__init__`` method (such as file objects) can be
491 handled correctly.
492
493 Since registered callbacks are invoked in the reverse order of
Nick Coghlan27228272012-05-31 22:17:08 +1000494 registration, this ends up behaving as if multiple nested :keyword:`with`
Nick Coghlan3267a302012-05-21 22:54:43 +1000495 statements had been used with the registered set of callbacks. This even
496 extends to exception handling - if an inner callback suppresses or replaces
497 an exception, then outer callbacks will be passed arguments based on that
498 updated state.
499
500 This is a relatively low level API that takes care of the details of
501 correctly unwinding the stack of exit callbacks. It provides a suitable
502 foundation for higher level context managers that manipulate the exit
503 stack in application specific ways.
504
Nick Coghlana497b442012-05-22 23:02:00 +1000505 .. versionadded:: 3.3
506
Nick Coghlan3267a302012-05-21 22:54:43 +1000507 .. method:: enter_context(cm)
508
509 Enters a new context manager and adds its :meth:`__exit__` method to
510 the callback stack. The return value is the result of the context
511 manager's own :meth:`__enter__` method.
512
513 These context managers may suppress exceptions just as they normally
Nick Coghlan27228272012-05-31 22:17:08 +1000514 would if used directly as part of a :keyword:`with` statement.
Nick Coghlan3267a302012-05-21 22:54:43 +1000515
516 .. method:: push(exit)
517
518 Adds a context manager's :meth:`__exit__` method to the callback stack.
519
520 As ``__enter__`` is *not* invoked, this method can be used to cover
521 part of an :meth:`__enter__` implementation with a context manager's own
522 :meth:`__exit__` method.
523
524 If passed an object that is not a context manager, this method assumes
525 it is a callback with the same signature as a context manager's
526 :meth:`__exit__` method and adds it directly to the callback stack.
527
528 By returning true values, these callbacks can suppress exceptions the
529 same way context manager :meth:`__exit__` methods can.
530
531 The passed in object is returned from the function, allowing this
Nick Coghlan27228272012-05-31 22:17:08 +1000532 method to be used as a function decorator.
Nick Coghlan3267a302012-05-21 22:54:43 +1000533
Serhiy Storchaka142566c2019-06-05 18:22:31 +0300534 .. method:: callback(callback, /, *args, **kwds)
Nick Coghlan3267a302012-05-21 22:54:43 +1000535
536 Accepts an arbitrary callback function and arguments and adds it to
537 the callback stack.
538
539 Unlike the other methods, callbacks added this way cannot suppress
540 exceptions (as they are never passed the exception details).
541
542 The passed in callback is returned from the function, allowing this
Nick Coghlan27228272012-05-31 22:17:08 +1000543 method to be used as a function decorator.
Nick Coghlan3267a302012-05-21 22:54:43 +1000544
545 .. method:: pop_all()
546
547 Transfers the callback stack to a fresh :class:`ExitStack` instance
548 and returns it. No callbacks are invoked by this operation - instead,
549 they will now be invoked when the new stack is closed (either
Nick Coghlan27228272012-05-31 22:17:08 +1000550 explicitly or implicitly at the end of a :keyword:`with` statement).
Nick Coghlan3267a302012-05-21 22:54:43 +1000551
552 For example, a group of files can be opened as an "all or nothing"
553 operation as follows::
554
555 with ExitStack() as stack:
556 files = [stack.enter_context(open(fname)) for fname in filenames]
Barry Warsawd8f870d2013-05-10 11:35:38 -0400557 # Hold onto the close method, but don't call it yet.
558 close_files = stack.pop_all().close
Nick Coghlan3267a302012-05-21 22:54:43 +1000559 # If opening any file fails, all previously opened files will be
560 # closed automatically. If all files are opened successfully,
561 # they will remain open even after the with statement ends.
Barry Warsawd8f870d2013-05-10 11:35:38 -0400562 # close_files() can then be invoked explicitly to close them all.
Nick Coghlan3267a302012-05-21 22:54:43 +1000563
564 .. method:: close()
565
566 Immediately unwinds the callback stack, invoking callbacks in the
567 reverse order of registration. For any context managers and exit
568 callbacks registered, the arguments passed in will indicate that no
569 exception occurred.
570
Ilya Kulakov1aa094f2018-01-25 12:51:18 -0800571.. class:: AsyncExitStack()
572
573 An :ref:`asynchronous context manager <async-context-managers>`, similar
574 to :class:`ExitStack`, that supports combining both synchronous and
575 asynchronous context managers, as well as having coroutines for
576 cleanup logic.
577
578 The :meth:`close` method is not implemented, :meth:`aclose` must be used
579 instead.
580
581 .. method:: enter_async_context(cm)
582
583 Similar to :meth:`enter_context` but expects an asynchronous context
584 manager.
585
586 .. method:: push_async_exit(exit)
587
588 Similar to :meth:`push` but expects either an asynchronous context manager
Nathaniel J. Smitha3c88ef2018-09-18 14:27:59 -0700589 or a coroutine function.
Ilya Kulakov1aa094f2018-01-25 12:51:18 -0800590
Serhiy Storchaka142566c2019-06-05 18:22:31 +0300591 .. method:: push_async_callback(callback, /, *args, **kwds)
Ilya Kulakov1aa094f2018-01-25 12:51:18 -0800592
Nathaniel J. Smitha3c88ef2018-09-18 14:27:59 -0700593 Similar to :meth:`callback` but expects a coroutine function.
Ilya Kulakov1aa094f2018-01-25 12:51:18 -0800594
595 .. method:: aclose()
596
597 Similar to :meth:`close` but properly handles awaitables.
598
599 Continuing the example for :func:`asynccontextmanager`::
600
601 async with AsyncExitStack() as stack:
602 connections = [await stack.enter_async_context(get_connection())
603 for i in range(5)]
604 # All opened connections will automatically be released at the end of
605 # the async with statement, even if attempts to open a connection
606 # later in the list raise an exception.
607
608 .. versionadded:: 3.7
Nick Coghlan3267a302012-05-21 22:54:43 +1000609
610Examples and Recipes
611--------------------
612
613This section describes some examples and recipes for making effective use of
614the tools provided by :mod:`contextlib`.
615
616
Nick Coghlan27228272012-05-31 22:17:08 +1000617Supporting a variable number of context managers
618^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
619
620The primary use case for :class:`ExitStack` is the one given in the class
621documentation: supporting a variable number of context managers and other
622cleanup operations in a single :keyword:`with` statement. The variability
623may come from the number of context managers needed being driven by user
624input (such as opening a user specified collection of files), or from
625some of the context managers being optional::
626
627 with ExitStack() as stack:
628 for resource in resources:
629 stack.enter_context(resource)
Raymond Hettingere8e2df32014-05-25 18:06:04 -0700630 if need_special_resource():
Nick Coghlan27228272012-05-31 22:17:08 +1000631 special = acquire_special_resource()
632 stack.callback(release_special_resource, special)
633 # Perform operations that use the acquired resources
634
635As shown, :class:`ExitStack` also makes it quite easy to use :keyword:`with`
636statements to manage arbitrary resources that don't natively support the
637context management protocol.
638
639
Nick Coghlan27228272012-05-31 22:17:08 +1000640Catching exceptions from ``__enter__`` methods
641^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
642
643It is occasionally desirable to catch exceptions from an ``__enter__``
644method implementation, *without* inadvertently catching exceptions from
645the :keyword:`with` statement body or the context manager's ``__exit__``
646method. By using :class:`ExitStack` the steps in the context management
647protocol can be separated slightly in order to allow this::
648
649 stack = ExitStack()
650 try:
651 x = stack.enter_context(cm)
652 except Exception:
653 # handle __enter__ exception
654 else:
655 with stack:
656 # Handle normal case
657
658Actually needing to do this is likely to indicate that the underlying API
659should be providing a direct resource management interface for use with
660:keyword:`try`/:keyword:`except`/:keyword:`finally` statements, but not
661all APIs are well designed in that regard. When a context manager is the
662only resource management API provided, then :class:`ExitStack` can make it
663easier to handle various situations that can't be handled directly in a
664:keyword:`with` statement.
665
666
Nick Coghlan3267a302012-05-21 22:54:43 +1000667Cleaning up in an ``__enter__`` implementation
668^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
669
670As noted in the documentation of :meth:`ExitStack.push`, this
671method can be useful in cleaning up an already allocated resource if later
672steps in the :meth:`__enter__` implementation fail.
673
674Here's an example of doing this for a context manager that accepts resource
675acquisition and release functions, along with an optional validation function,
676and maps them to the context management protocol::
677
Brett Cannon9e080e02016-04-08 12:15:27 -0700678 from contextlib import contextmanager, AbstractContextManager, ExitStack
Nick Coghlan3267a302012-05-21 22:54:43 +1000679
Brett Cannon9e080e02016-04-08 12:15:27 -0700680 class ResourceManager(AbstractContextManager):
Nick Coghlan3267a302012-05-21 22:54:43 +1000681
682 def __init__(self, acquire_resource, release_resource, check_resource_ok=None):
683 self.acquire_resource = acquire_resource
684 self.release_resource = release_resource
685 if check_resource_ok is None:
686 def check_resource_ok(resource):
687 return True
688 self.check_resource_ok = check_resource_ok
689
690 @contextmanager
691 def _cleanup_on_error(self):
692 with ExitStack() as stack:
693 stack.push(self)
694 yield
695 # The validation check passed and didn't raise an exception
696 # Accordingly, we want to keep the resource, and pass it
697 # back to our caller
698 stack.pop_all()
699
700 def __enter__(self):
701 resource = self.acquire_resource()
702 with self._cleanup_on_error():
703 if not self.check_resource_ok(resource):
704 msg = "Failed validation for {!r}"
705 raise RuntimeError(msg.format(resource))
706 return resource
707
708 def __exit__(self, *exc_details):
709 # We don't need to duplicate any of our resource release logic
710 self.release_resource()
711
712
713Replacing any use of ``try-finally`` and flag variables
714^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
715
716A pattern you will sometimes see is a ``try-finally`` statement with a flag
717variable to indicate whether or not the body of the ``finally`` clause should
718be executed. In its simplest form (that can't already be handled just by
719using an ``except`` clause instead), it looks something like this::
720
721 cleanup_needed = True
722 try:
723 result = perform_operation()
724 if result:
725 cleanup_needed = False
726 finally:
727 if cleanup_needed:
728 cleanup_resources()
729
730As with any ``try`` statement based code, this can cause problems for
731development and review, because the setup code and the cleanup code can end
732up being separated by arbitrarily long sections of code.
733
734:class:`ExitStack` makes it possible to instead register a callback for
735execution at the end of a ``with`` statement, and then later decide to skip
736executing that callback::
737
738 from contextlib import ExitStack
739
740 with ExitStack() as stack:
741 stack.callback(cleanup_resources)
742 result = perform_operation()
743 if result:
744 stack.pop_all()
745
746This allows the intended cleanup up behaviour to be made explicit up front,
747rather than requiring a separate flag variable.
748
749If a particular application uses this pattern a lot, it can be simplified
750even further by means of a small helper class::
751
752 from contextlib import ExitStack
753
754 class Callback(ExitStack):
Serhiy Storchaka2085bd02019-06-01 11:00:15 +0300755 def __init__(self, callback, /, *args, **kwds):
Nick Coghlan3267a302012-05-21 22:54:43 +1000756 super(Callback, self).__init__()
757 self.callback(callback, *args, **kwds)
758
759 def cancel(self):
760 self.pop_all()
761
762 with Callback(cleanup_resources) as cb:
763 result = perform_operation()
764 if result:
765 cb.cancel()
766
767If the resource cleanup isn't already neatly bundled into a standalone
768function, then it is still possible to use the decorator form of
769:meth:`ExitStack.callback` to declare the resource cleanup in
770advance::
771
772 from contextlib import ExitStack
773
774 with ExitStack() as stack:
775 @stack.callback
776 def cleanup_resources():
777 ...
778 result = perform_operation()
779 if result:
780 stack.pop_all()
781
782Due to the way the decorator protocol works, a callback function
783declared this way cannot take any parameters. Instead, any resources to
Martin Panterd21e0b52015-10-10 10:36:22 +0000784be released must be accessed as closure variables.
Nick Coghlan3267a302012-05-21 22:54:43 +1000785
786
787Using a context manager as a function decorator
788^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
789
790:class:`ContextDecorator` makes it possible to use a context manager in
791both an ordinary ``with`` statement and also as a function decorator.
792
793For example, it is sometimes useful to wrap functions or groups of statements
794with a logger that can track the time of entry and time of exit. Rather than
795writing both a function decorator and a context manager for the task,
796inheriting from :class:`ContextDecorator` provides both capabilities in a
797single definition::
798
799 from contextlib import ContextDecorator
800 import logging
801
802 logging.basicConfig(level=logging.INFO)
803
804 class track_entry_and_exit(ContextDecorator):
805 def __init__(self, name):
806 self.name = name
807
808 def __enter__(self):
Vinay Sajipdd917f82016-08-31 08:22:29 +0100809 logging.info('Entering: %s', self.name)
Nick Coghlan3267a302012-05-21 22:54:43 +1000810
811 def __exit__(self, exc_type, exc, exc_tb):
Vinay Sajipdd917f82016-08-31 08:22:29 +0100812 logging.info('Exiting: %s', self.name)
Nick Coghlan3267a302012-05-21 22:54:43 +1000813
814Instances of this class can be used as both a context manager::
815
816 with track_entry_and_exit('widget loader'):
817 print('Some time consuming activity goes here')
818 load_widget()
819
820And also as a function decorator::
821
822 @track_entry_and_exit('widget loader')
823 def activity():
824 print('Some time consuming activity goes here')
825 load_widget()
826
827Note that there is one additional limitation when using context managers
828as function decorators: there's no way to access the return value of
829:meth:`__enter__`. If that value is needed, then it is still necessary to use
830an explicit ``with`` statement.
831
Georg Brandl116aa622007-08-15 14:28:22 +0000832.. seealso::
833
Serhiy Storchakae4ba8722016-03-31 15:30:54 +0300834 :pep:`343` - The "with" statement
Georg Brandl116aa622007-08-15 14:28:22 +0000835 The specification, background, and examples for the Python :keyword:`with`
836 statement.
837
Nick Coghlan0acceb72013-10-20 13:22:21 +1000838.. _single-use-reusable-and-reentrant-cms:
Nick Coghlan8608d262013-10-20 00:30:51 +1000839
Nick Coghlan0acceb72013-10-20 13:22:21 +1000840Single use, reusable and reentrant context managers
841---------------------------------------------------
Nick Coghlan8608d262013-10-20 00:30:51 +1000842
843Most context managers are written in a way that means they can only be
844used effectively in a :keyword:`with` statement once. These single use
845context managers must be created afresh each time they're used -
846attempting to use them a second time will trigger an exception or
847otherwise not work correctly.
848
849This common limitation means that it is generally advisable to create
850context managers directly in the header of the :keyword:`with` statement
851where they are used (as shown in all of the usage examples above).
852
853Files are an example of effectively single use context managers, since
854the first :keyword:`with` statement will close the file, preventing any
855further IO operations using that file object.
856
857Context managers created using :func:`contextmanager` are also single use
858context managers, and will complain about the underlying generator failing
859to yield if an attempt is made to use them a second time::
860
861 >>> from contextlib import contextmanager
862 >>> @contextmanager
863 ... def singleuse():
864 ... print("Before")
865 ... yield
866 ... print("After")
867 ...
868 >>> cm = singleuse()
869 >>> with cm:
870 ... pass
871 ...
872 Before
873 After
874 >>> with cm:
Serhiy Storchakadba90392016-05-10 12:01:23 +0300875 ... pass
Nick Coghlan8608d262013-10-20 00:30:51 +1000876 ...
877 Traceback (most recent call last):
878 ...
879 RuntimeError: generator didn't yield
880
881
882.. _reentrant-cms:
883
884Reentrant context managers
885^^^^^^^^^^^^^^^^^^^^^^^^^^
886
887More sophisticated context managers may be "reentrant". These context
888managers can not only be used in multiple :keyword:`with` statements,
Serhiy Storchaka2b57c432018-12-19 08:09:46 +0200889but may also be used *inside* a :keyword:`!with` statement that is already
Nick Coghlan8608d262013-10-20 00:30:51 +1000890using the same context manager.
891
Nick Coghlan8e113b42013-11-03 17:00:51 +1000892:class:`threading.RLock` is an example of a reentrant context manager, as are
893:func:`suppress` and :func:`redirect_stdout`. Here's a very simple example of
894reentrant use::
Nick Coghlan8608d262013-10-20 00:30:51 +1000895
Nick Coghlan8e113b42013-11-03 17:00:51 +1000896 >>> from contextlib import redirect_stdout
897 >>> from io import StringIO
898 >>> stream = StringIO()
899 >>> write_to_stream = redirect_stdout(stream)
900 >>> with write_to_stream:
901 ... print("This is written to the stream rather than stdout")
902 ... with write_to_stream:
903 ... print("This is also written to the stream")
Nick Coghlan8608d262013-10-20 00:30:51 +1000904 ...
Nick Coghlan8e113b42013-11-03 17:00:51 +1000905 >>> print("This is written directly to stdout")
906 This is written directly to stdout
907 >>> print(stream.getvalue())
908 This is written to the stream rather than stdout
909 This is also written to the stream
910
911Real world examples of reentrancy are more likely to involve multiple
912functions calling each other and hence be far more complicated than this
913example.
914
915Note also that being reentrant is *not* the same thing as being thread safe.
916:func:`redirect_stdout`, for example, is definitely not thread safe, as it
917makes a global modification to the system state by binding :data:`sys.stdout`
918to a different stream.
Nick Coghlan8608d262013-10-20 00:30:51 +1000919
920
921.. _reusable-cms:
922
923Reusable context managers
924^^^^^^^^^^^^^^^^^^^^^^^^^
925
926Distinct from both single use and reentrant context managers are "reusable"
927context managers (or, to be completely explicit, "reusable, but not
928reentrant" context managers, since reentrant context managers are also
929reusable). These context managers support being used multiple times, but
930will fail (or otherwise not work correctly) if the specific context manager
931instance has already been used in a containing with statement.
932
Nick Coghlan8e113b42013-11-03 17:00:51 +1000933:class:`threading.Lock` is an example of a reusable, but not reentrant,
934context manager (for a reentrant lock, it is necessary to use
935:class:`threading.RLock` instead).
Nick Coghlan8608d262013-10-20 00:30:51 +1000936
Nick Coghlan8e113b42013-11-03 17:00:51 +1000937Another example of a reusable, but not reentrant, context manager is
938:class:`ExitStack`, as it invokes *all* currently registered callbacks
939when leaving any with statement, regardless of where those callbacks
940were added::
Nick Coghlan8608d262013-10-20 00:30:51 +1000941
Nick Coghlan8e113b42013-11-03 17:00:51 +1000942 >>> from contextlib import ExitStack
943 >>> stack = ExitStack()
944 >>> with stack:
945 ... stack.callback(print, "Callback: from first context")
946 ... print("Leaving first context")
Nick Coghlan8608d262013-10-20 00:30:51 +1000947 ...
Nick Coghlan8e113b42013-11-03 17:00:51 +1000948 Leaving first context
949 Callback: from first context
950 >>> with stack:
951 ... stack.callback(print, "Callback: from second context")
952 ... print("Leaving second context")
953 ...
954 Leaving second context
955 Callback: from second context
956 >>> with stack:
957 ... stack.callback(print, "Callback: from outer context")
958 ... with stack:
959 ... stack.callback(print, "Callback: from inner context")
960 ... print("Leaving inner context")
961 ... print("Leaving outer context")
962 ...
963 Leaving inner context
964 Callback: from inner context
965 Callback: from outer context
966 Leaving outer context
967
968As the output from the example shows, reusing a single stack object across
969multiple with statements works correctly, but attempting to nest them
970will cause the stack to be cleared at the end of the innermost with
971statement, which is unlikely to be desirable behaviour.
972
973Using separate :class:`ExitStack` instances instead of reusing a single
974instance avoids that problem::
975
976 >>> from contextlib import ExitStack
977 >>> with ExitStack() as outer_stack:
978 ... outer_stack.callback(print, "Callback: from outer context")
979 ... with ExitStack() as inner_stack:
980 ... inner_stack.callback(print, "Callback: from inner context")
981 ... print("Leaving inner context")
982 ... print("Leaving outer context")
983 ...
984 Leaving inner context
985 Callback: from inner context
986 Leaving outer context
987 Callback: from outer context