summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorTom Gringauz <tomgrin10@gmail.com>2020-11-09 12:34:07 (GMT)
committerGitHub <noreply@github.com>2020-11-09 12:34:07 (GMT)
commita117167d8dc8fa673a4646f509551c7950f824e5 (patch)
tree14ed56dc05c33931932c8e911a76b374d9fd74b1 /Lib
parent97e8b1eaeaf3aa325c84ff2e13417c30414d0269 (diff)
downloadcpython-a117167d8dc8fa673a4646f509551c7950f824e5.zip
cpython-a117167d8dc8fa673a4646f509551c7950f824e5.tar.gz
cpython-a117167d8dc8fa673a4646f509551c7950f824e5.tar.bz2
bpo-41543: contextlib.nullcontext can fill in for an async context manager (GH-21870)
Co-authored-by: Andrew Svetlov <andrew.svetlov@gmail.com>
Diffstat (limited to 'Lib')
-rw-r--r--Lib/contextlib.py8
-rw-r--r--Lib/test/test_contextlib_async.py14
2 files changed, 20 insertions, 2 deletions
diff --git a/Lib/contextlib.py b/Lib/contextlib.py
index 56b4968..a0b523c 100644
--- a/Lib/contextlib.py
+++ b/Lib/contextlib.py
@@ -704,7 +704,7 @@ class AsyncExitStack(_BaseExitStack, AbstractAsyncContextManager):
return received_exc and suppressed_exc
-class nullcontext(AbstractContextManager):
+class nullcontext(AbstractContextManager, AbstractAsyncContextManager):
"""Context manager that does no additional processing.
Used as a stand-in for a normal context manager, when a particular
@@ -723,3 +723,9 @@ class nullcontext(AbstractContextManager):
def __exit__(self, *excinfo):
pass
+
+ async def __aenter__(self):
+ return self.enter_result
+
+ async def __aexit__(self, *excinfo):
+ pass
diff --git a/Lib/test/test_contextlib_async.py b/Lib/test/test_contextlib_async.py
index 109807d..290ef05 100644
--- a/Lib/test/test_contextlib_async.py
+++ b/Lib/test/test_contextlib_async.py
@@ -1,5 +1,7 @@
import asyncio
-from contextlib import aclosing, asynccontextmanager, AbstractAsyncContextManager, AsyncExitStack
+from contextlib import (
+ asynccontextmanager, AbstractAsyncContextManager,
+ AsyncExitStack, nullcontext, aclosing)
import functools
from test import support
import unittest
@@ -537,5 +539,15 @@ class TestAsyncExitStack(TestBaseExitStack, unittest.TestCase):
self.assertIsInstance(inner_exc.__context__, ZeroDivisionError)
+class TestAsyncNullcontext(unittest.TestCase):
+ @_async_test
+ async def test_async_nullcontext(self):
+ class C:
+ pass
+ c = C()
+ async with nullcontext(c) as c_in:
+ self.assertIs(c_in, c)
+
+
if __name__ == '__main__':
unittest.main()