Aliases to :mod:`contextlib` ABCs
"""""""""""""""""""""""""""""""""
-.. class:: ContextManager(Generic[T_co])
+.. class:: ContextManager(Generic[T_co, ExitT_co])
Deprecated alias to :class:`contextlib.AbstractContextManager`.
+ The first type parameter, ``T_co``, represents the type returned by
+ the :meth:`~object.__enter__` method. The optional second type parameter, ``ExitT_co``,
+ which defaults to ``bool | None``, represents the type returned by the
+ :meth:`~object.__exit__` method.
+
.. versionadded:: 3.5.4
.. deprecated:: 3.9
now supports subscripting (``[]``).
See :pep:`585` and :ref:`types-genericalias`.
-.. class:: AsyncContextManager(Generic[T_co])
+ .. versionchanged:: 3.13
+ Added the optional second type parameter, ``ExitT_co``.
+
+.. class:: AsyncContextManager(Generic[T_co, AExitT_co])
Deprecated alias to :class:`contextlib.AbstractAsyncContextManager`.
+ The first type parameter, ``T_co``, represents the type returned by
+ the :meth:`~object.__aenter__` method. The optional second type parameter, ``AExitT_co``,
+ which defaults to ``bool | None``, represents the type returned by the
+ :meth:`~object.__aexit__` method.
+
.. versionadded:: 3.6.2
.. deprecated:: 3.9
now supports subscripting (``[]``).
See :pep:`585` and :ref:`types-genericalias`.
+ .. versionchanged:: 3.13
+ Added the optional second type parameter, ``AExitT_co``.
+
Deprecation Timeline of Major Features
======================================
self.assertIsInstance(cm, typing.ContextManager)
self.assertNotIsInstance(42, typing.ContextManager)
+ def test_contextmanager_type_params(self):
+ cm1 = typing.ContextManager[int]
+ self.assertEqual(get_args(cm1), (int, bool | None))
+ cm2 = typing.ContextManager[int, None]
+ self.assertEqual(get_args(cm2), (int, types.NoneType))
+
+ type gen_cm[T1, T2] = typing.ContextManager[T1, T2]
+ self.assertEqual(get_args(gen_cm.__value__[int, None]), (int, types.NoneType))
+
def test_async_contextmanager(self):
class NotACM:
pass
cm = manager()
self.assertNotIsInstance(cm, typing.AsyncContextManager)
- self.assertEqual(typing.AsyncContextManager[int].__args__, (int,))
+ self.assertEqual(typing.AsyncContextManager[int].__args__, (int, bool | None))
with self.assertRaises(TypeError):
isinstance(42, typing.AsyncContextManager[int])
with self.assertRaises(TypeError):
- typing.AsyncContextManager[int, str]
+ typing.AsyncContextManager[int, str, float]
+
+ def test_asynccontextmanager_type_params(self):
+ cm1 = typing.AsyncContextManager[int]
+ self.assertEqual(get_args(cm1), (int, bool | None))
+ cm2 = typing.AsyncContextManager[int, None]
+ self.assertEqual(get_args(cm2), (int, types.NoneType))
class TypeTests(BaseTestCase):
typing.ValuesView: 'ValuesView',
# Subscribed ABC classes
typing.AbstractSet[Any]: 'AbstractSet',
- typing.AsyncContextManager[Any]: 'AsyncContextManager',
+ typing.AsyncContextManager[Any, Any]: 'AsyncContextManager',
typing.AsyncGenerator[Any, Any]: 'AsyncGenerator',
typing.AsyncIterable[Any]: 'AsyncIterable',
typing.AsyncIterator[Any]: 'AsyncIterator',
typing.ChainMap[Any, Any]: 'ChainMap',
typing.Collection[Any]: 'Collection',
typing.Container[Any]: 'Container',
- typing.ContextManager[Any]: 'ContextManager',
+ typing.ContextManager[Any, Any]: 'ContextManager',
typing.Coroutine[Any, Any, Any]: 'Coroutine',
typing.Counter[Any]: 'Counter',
typing.DefaultDict[Any, Any]: 'DefaultDict',