[Python-checkins] bpo-38013: make async_generator_athrow object tolerant to throwing exceptions (GH-16070)

Miss Islington (bot) webhook-mailer at python.org
Tue Sep 17 09:20:11 EDT 2019


https://github.com/python/cpython/commit/3c1786f18b1542e71454f37e3f3ca1ef3eec0e5f
commit: 3c1786f18b1542e71454f37e3f3ca1ef3eec0e5f
branch: 3.8
author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com>
committer: GitHub <noreply at github.com>
date: 2019年09月17日T06:20:06-07:00
summary:
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
(cherry picked from commit c275312a6284bd319ea33c9abd7e15c230eca43f)
Co-authored-by: Andrew Svetlov <andrew.svetlov at gmail.com>
files:
A Misc/NEWS.d/next/Core and Builtins/2019-09-12-19-50-01.bpo-38013.I7btD0.rst
M Lib/test/test_asyncgen.py
M Objects/genobject.c
diff --git a/Lib/test/test_asyncgen.py b/Lib/test/test_asyncgen.py
index 71b0968c7944..3a8d5fd4007f 100644
--- a/Lib/test/test_asyncgen.py
+++ b/Lib/test/test_asyncgen.py
@@ -1125,6 +1125,28 @@ def make_arange(n):
 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 000000000000..a61aa48ff1ef
--- /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 2d9a2860a3d2..f1e9fec78a46 100644
--- a/Objects/genobject.c
+++ b/Objects/genobject.c
@@ -1900,11 +1900,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;


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /