diff options
author | Andrew Svetlov <andrew.svetlov@gmail.com> | 2019-09-17 12:59:49 (GMT) |
---|---|---|
committer | Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> | 2019-09-17 12:59:49 (GMT) |
commit | c275312a6284bd319ea33c9abd7e15c230eca43f (patch) | |
tree | 17639459db0543af603b2bd5f1b7fcc9e02c59e7 | |
parent | 5f5f11faf9de0d8dcbe1a8a4eb35d2a4232d6eaa (diff) | |
download | cpython-c275312a6284bd319ea33c9abd7e15c230eca43f.zip cpython-c275312a6284bd319ea33c9abd7e15c230eca43f.tar.gz cpython-c275312a6284bd319ea33c9abd7e15c230eca43f.tar.bz2 |
bpo-38013: make async_generator_athrow object tolerant to throwing exceptions (GH-16070)
Even when the helper is not started yet.
This behavior follows conventional generator one.
There is no reason for `async_generator_athrow` to handle `gen.throw()` differently.
https://bugs.python.org/issue38013
-rw-r--r-- | Lib/test/test_asyncgen.py | 22 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Core and Builtins/2019-09-12-19-50-01.bpo-38013.I7btD0.rst | 3 | ||||
-rw-r--r-- | Objects/genobject.c | 5 |
3 files changed, 25 insertions, 5 deletions
diff --git a/Lib/test/test_asyncgen.py b/Lib/test/test_asyncgen.py index 71b0968..3a8d5fd 100644 --- a/Lib/test/test_asyncgen.py +++ b/Lib/test/test_asyncgen.py @@ -1125,6 +1125,28 @@ class AsyncGenAsyncioTest(unittest.TestCase): res = self.loop.run_until_complete(run()) self.assertEqual(res, [i * 2 for i in range(1, 10)]) + def test_asyncgen_nonstarted_hooks_are_cancellable(self): + # See https://bugs.python.org/issue38013 + messages = [] + + def exception_handler(loop, context): + messages.append(context) + + async def async_iterate(): + yield 1 + yield 2 + + async def main(): + loop = asyncio.get_running_loop() + loop.set_exception_handler(exception_handler) + + async for i in async_iterate(): + break + + asyncio.run(main()) + + self.assertEqual([], messages) + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-09-12-19-50-01.bpo-38013.I7btD0.rst b/Misc/NEWS.d/next/Core and Builtins/2019-09-12-19-50-01.bpo-38013.I7btD0.rst new file mode 100644 index 0000000..a61aa48 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-09-12-19-50-01.bpo-38013.I7btD0.rst @@ -0,0 +1,3 @@ +Allow to call ``async_generator_athrow().throw(...)`` even for non-started +async generator helper. It fixes annoying warning at the end of +:func:`asyncio.run` call. diff --git a/Objects/genobject.c b/Objects/genobject.c index 9f490b4..82e6e55 100644 --- a/Objects/genobject.c +++ b/Objects/genobject.c @@ -1884,11 +1884,6 @@ async_gen_athrow_throw(PyAsyncGenAThrow *o, PyObject *args) { PyObject *retval; - if (o->agt_state == AWAITABLE_STATE_INIT) { - PyErr_SetString(PyExc_RuntimeError, NON_INIT_CORO_MSG); - return NULL; - } - if (o->agt_state == AWAITABLE_STATE_CLOSED) { PyErr_SetNone(PyExc_StopIteration); return NULL; |