bpo-30241: implement contextlib.AbstractAsyncContextManager (#1412)

This commit is contained in:
Jelle Zijlstra 2017-12-13 17:19:17 -08:00 committed by Yury Selivanov
parent bfbf04ef18
commit 176baa326b
5 changed files with 88 additions and 5 deletions

View file

@ -6,7 +6,8 @@ from collections import deque
from functools import wraps
__all__ = ["asynccontextmanager", "contextmanager", "closing", "nullcontext",
"AbstractContextManager", "ContextDecorator", "ExitStack",
"AbstractContextManager", "AbstractAsyncContextManager",
"ContextDecorator", "ExitStack",
"redirect_stdout", "redirect_stderr", "suppress"]
@ -30,6 +31,27 @@ class AbstractContextManager(abc.ABC):
return NotImplemented
class AbstractAsyncContextManager(abc.ABC):
"""An abstract base class for asynchronous context managers."""
async def __aenter__(self):
"""Return `self` upon entering the runtime context."""
return self
@abc.abstractmethod
async def __aexit__(self, exc_type, exc_value, traceback):
"""Raise any exception triggered within the runtime context."""
return None
@classmethod
def __subclasshook__(cls, C):
if cls is AbstractAsyncContextManager:
return _collections_abc._check_methods(C, "__aenter__",
"__aexit__")
return NotImplemented
class ContextDecorator(object):
"A base class or mixin that enables context managers to work as decorators."
@ -136,7 +158,8 @@ class _GeneratorContextManager(_GeneratorContextManagerBase,
raise RuntimeError("generator didn't stop after throw()")
class _AsyncGeneratorContextManager(_GeneratorContextManagerBase):
class _AsyncGeneratorContextManager(_GeneratorContextManagerBase,
AbstractAsyncContextManager):
"""Helper for @asynccontextmanager."""
async def __aenter__(self):