bpo-46672: fix `NameError` in `asyncio.gather` if type check fails (GH-31187)

Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com>
This commit is contained in:
Nikita Sobolev 2022-02-20 13:24:00 +03:00 committed by GitHub
parent e7130c2e8c
commit 4ab8167b9c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 17 additions and 1 deletions

View File

@ -735,7 +735,7 @@ def gather(*coros_or_futures, return_exceptions=False):
nonlocal nfinished nonlocal nfinished
nfinished += 1 nfinished += 1
if outer.done(): if outer is None or outer.done():
if not fut.cancelled(): if not fut.cancelled():
# Mark exception retrieved. # Mark exception retrieved.
fut.exception() fut.exception()
@ -791,6 +791,7 @@ def gather(*coros_or_futures, return_exceptions=False):
nfuts = 0 nfuts = 0
nfinished = 0 nfinished = 0
loop = None loop = None
outer = None # bpo-46672
for arg in coros_or_futures: for arg in coros_or_futures:
if arg not in arg_to_fut: if arg not in arg_to_fut:
fut = _ensure_future(arg, loop=loop) fut = _ensure_future(arg, loop=loop)

View File

@ -3235,6 +3235,20 @@ class CoroutineGatherTests(GatherTestsBase, test_utils.TestCase):
test_utils.run_briefly(self.one_loop) test_utils.run_briefly(self.one_loop)
self.assertIsInstance(f.exception(), RuntimeError) self.assertIsInstance(f.exception(), RuntimeError)
def test_issue46672(self):
with mock.patch(
'asyncio.base_events.BaseEventLoop.call_exception_handler',
):
async def coro(s):
return s
c = coro('abc')
with self.assertRaises(TypeError):
self._gather(c, {})
self._run_loop(self.one_loop)
# NameError should not happen:
self.one_loop.call_exception_handler.assert_not_called()
class RunCoroutineThreadsafeTests(test_utils.TestCase): class RunCoroutineThreadsafeTests(test_utils.TestCase):
"""Test case for asyncio.run_coroutine_threadsafe.""" """Test case for asyncio.run_coroutine_threadsafe."""

View File

@ -0,0 +1 @@
Fix ``NameError`` in :func:`asyncio.gather` when initial type check fails.