contextlib2 — Updated utilities for context management

This module provides backports of features in the latest version of the standard library’s contextlib module to earlier Python versions. It also serves as a real world proving ground for potential future enhancements to that module.

Like contextlib, this module provides utilities for common tasks involving the with and async with statements.

Additions Relative to the Standard Library

This module is primarily a backport of the Python 3.12.3 version of contextlib to earlier releases. (Note: as of the start of the Python 3.13 beta release cycle, there have been no subsequent changes to contextlib)

The module makes use of positional-only argument syntax in several call signatures, so the oldest supported Python version is Python 3.8.

This module may also be used as a proving ground for new features not yet part of the standard library. There are currently no such features in the module.

Finally, this module contains some deprecated APIs which never graduated to standard library inclusion. These interfaces are no longer documented, but may still be present in the code (emitting DeprecationWarning if used).

Using the Module

Obtaining the Module

This module can be installed directly from the Python Package Index with pip:

pip install contextlib2

Alternatively, you can download and unpack it manually from the contextlib2 PyPI page.

There are no operating system or distribution specific versions of this module - it is a pure Python module that should work on all platforms.

Supported Python versions are currently 3.8+.

Development and Support

contextlib2 is developed and maintained on GitHub. Problems and suggested improvements can be posted to the issue tracker.

Release History

24.6.0 (2024-06-??)

  • To allow the use of positional-only argument syntax, the minimum supported Python version is now Python 3.8.

  • Synchronised with the Python 3.12.3 (and 3.13.0) version of contextlib (#12), making the following new features available on Python 3.8+:

    • chdir (added in Python 3.11)

    • suppress() filters the contents of BaseExceptionGroup (Python 3.12)

    • improved handling of StopIteration subclasses (Python 3.11)

  • The exception thrown by ExitStack.enter_context() and AsyncExitStack.enter_async_context() when the given object does not implement the relevant context management protocol is now version-dependent (TypeError on 3.11+, AttributeError on earlier versions). This provides consistency with the with and async with behaviour on the corresponding versions.

  • No longer needed object references are now released more promptly

  • Update mypy stubtest to work with recent mypy versions (mypy 1.8.0 tested) (#54)

  • The dev/mypy.allowlist file needed for the mypy stubtest step in the tox test configuration is now included in the published sdist (#53)

  • Type hints have been updated to include nullcontext (3.10 API added in 21.6.0) (#41)

  • Test suite updated to pass on Python 3.11 and 3.12 (21.6.0 works on these versions, the test suite just failed due to no longer valid assumptions) (#51)

  • Updates to the default compatibility testing matrix:

    • Added: CPython 3.11, CPython 3.12

    • Dropped: CPython 3.6, CPython 3.7

21.6.0 (2021年06月27日)

  • License update: due to the inclusion of type hints from the typeshed project, the contextlib2 project is now under a combination of the Python Software License (existing license) and the Apache License 2.0 (typeshed license)

  • Switched to calendar based versioning using a "year"-"month"-"serial" scheme, rather than continuing with pre-1.0 semantic versioning

  • Due to the inclusion of asynchronous features from Python 3.7+, the minimum supported Python version is now Python 3.6 (#29)

  • Synchronised with the Python 3.10 version of contextlib (#12), making the following new features available on Python 3.6+:

    • asyncontextmanager (added in Python 3.7, enhanced in Python 3.10)

    • aclosing (added in Python 3.10)

    • AbstractAsyncContextManager (added in Python 3.7)

    • AsyncContextDecorator (added in Python 3.10)

    • AsyncExitStack (added in Python 3.7)

    • async support in nullcontext (Python 3.10)

  • contextlib2 now includes an adapted copy of the contextlib type hints from typeshed (the adaptation removes the Python version dependencies from the API definition) (#33)

  • to incorporate the type hints stub file and the py.typed marker file, contextlib2 is now installed as a package rather than as a module

  • Updates to the default compatibility testing matrix:

    • Added: CPython 3.9, CPython 3.10

    • Dropped: CPython 2.7, CPython 3.5, PyPy2

0.6.0.post1 (2019年10月10日)

  • Issue #24: Correctly update NEWS.rst for the 0.6.0 release.

0.6.0 (2019年09月21日)

  • Issue #16: Backport AbstractContextManager from Python 3.6 and nullcontext from Python 3.7 (patch by John Vandenberg)

0.5.5 (2017年04月25日)

  • Issue #13: setup.py now falls back to plain distutils if setuptools is not available (patch by Allan Harwood)

  • Updates to the default compatibility testing matrix:

    • Added: PyPy3, CPython 3.6 (maintenance), CPython 3.7 (development)

    • Dropped: CPython 3.3

0.5.4 (2016年07月31日)

  • Thanks to the welcome efforts of Jannis Leidel, contextlib2 is now a [Jazzband](https://jazzband.co/) project! This means that I (Alyssa Coghlan) am no longer a single point of failure for backports of future contextlib updates to earlier Python versions.

  • Issue #7: Backported fix for CPython issue #27122, preventing a potential infinite loop on Python 3.5 when handling RuntimeError (CPython updates by Gregory P. Smith & Serhiy Storchaka)

0.5.3 (2016年05月02日)

  • ExitStack now correctly handles context managers implemented as old-style classes in Python 2.x (such as codecs.StreamReader and codecs.StreamWriter)

  • setup.py has been migrated to setuptools and configured to emit a universal wheel file by default

0.5.2 (2016年05月02日)

  • development migrated from BitBucket to GitHub

  • redirect_stream, redirect_stdout, redirect_stderr and suppress now explicitly inherit from object, ensuring compatibility with ExitStack when run under Python 2.x (patch contributed by Devin Jeanpierre).

  • MANIFEST.in is now included in the published sdist, ensuring the archive can be precisely recreated even without access to the original source repo (patch contributed by Guy Rozendorn)

0.5.1 (2016年01月13日)

  • Python 2.6 compatilibity restored (patch contributed by Armin Ronacher)

  • README converted back to reStructured Text formatting

0.5.0 (2016年01月12日)

  • Updated to include all features from the Python 3.4 and 3.5 releases of contextlib (also includes some ExitStack enhancements made following the integration into the standard library for Python 3.3)

  • The legacy ContextStack and ContextDecorator.refresh_cm APIs are no longer documented and emit DeprecationWarning when used

  • Python 2.6, 3.2 and 3.3 have been dropped from compatibility testing

  • tox is now supported for local version compatibility testing (patch by Marc Abramowitz)

0.4.0 (2012年05月05日)

  • (BitBucket) Issue #8: Replace ContextStack with ExitStack (old ContextStack API retained for backwards compatibility)

  • Fall back to unittest2 if unittest is missing required functionality

0.3.1 (2012年01月17日)

  • (BitBucket) Issue #7: Add MANIFEST.in so PyPI package contains all relevant files (patch contributed by Doug Latornell)

0.3 (2012年01月04日)

  • (BitBucket) Issue #5: ContextStack.register no longer pointlessly returns the wrapped function

  • (BitBucket) Issue #2: Add examples and recipes section to docs

  • (BitBucket) Issue #3: ContextStack.register_exit() now accepts objects with __exit__ attributes in addition to accepting exit callbacks directly

  • (BitBucket) Issue #1: Add ContextStack.preserve() to move all registered callbacks to a new ContextStack object

  • Wrapped callbacks now expose __wrapped__ (for direct callbacks) or __self__ (for context manager methods) attributes to aid in introspection

  • Moved version number to a VERSION.txt file (read by both docs and setup.py)

  • Added NEWS.rst (and incorporated into documentation)

0.2 (2011年12月15日)

  • Renamed CleanupManager to ContextStack (hopefully before anyone started using the module for anything, since I didn’t alias the old name at all)

0.1 (2011年12月13日)

Indices and tables