import sys from contextlib import AbstractContextManager if sys.version_info < (3, 11): from ._exceptions import BaseExceptionGroup class suppress(AbstractContextManager): """Backport of :class:`contextlib.suppress` from Python 3.12.1.""" def __init__(self, *exceptions): self._exceptions = exceptions def __enter__(self): pass def __exit__(self, exctype, excinst, exctb): # Unlike isinstance and issubclass, CPython exception handling # currently only looks at the concrete type hierarchy (ignoring # the instance and subclass checking hooks). While Guido considers # that a bug rather than a feature, it's a fairly hard one to fix # due to various internal implementation details. suppress provides # the simpler issubclass based semantics, rather than trying to # exactly reproduce the limitations of the CPython interpreter. # # See http://bugs.python.org/issue12029 for more details if exctype is None: return if issubclass(exctype, self._exceptions): return True if issubclass(exctype, BaseExceptionGroup): match, rest = excinst.split(self._exceptions) if rest is None: return True raise rest return False