mirror of https://github.com/python/cpython
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:
parent
e7130c2e8c
commit
4ab8167b9c
|
@ -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)
|
||||||
|
|
|
@ -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."""
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Fix ``NameError`` in :func:`asyncio.gather` when initial type check fails.
|
Loading…
Reference in New Issue