From 80a09281a5480b262643b69728f0f5ed6ae290df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Batuhan=20Ta=C5=9Fkaya?= <47358913+isidentical@users.noreply.github.com> Date: Thu, 19 Mar 2020 14:35:44 +0300 Subject: [PATCH] bpo-39562: Allow executing asynchronous comprehensions in the asyncio REPL (GH-18968) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Pablo Galindo (cherry picked from commit 9052f7a41b90f2d34011c8da68f9a4facebc8a97) Co-authored-by: Batuhan Taşkaya <47358913+isidentical@users.noreply.github.com> --- Lib/test/test_builtin.py | 9 ++++++++- .../2020-03-12-22-13-50.bpo-39562.E2u273.rst | 2 ++ Python/compile.c | 7 +++++-- 3 files changed, 15 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-03-12-22-13-50.bpo-39562.E2u273.rst diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py index 0d241587a86908..f680e02fdf5204 100644 --- a/Lib/test/test_builtin.py +++ b/Lib/test/test_builtin.py @@ -390,7 +390,14 @@ async def arange(n): '''async for i in arange(1): a = 1''', '''async with asyncio.Lock() as l: - a = 1''' + a = 1''', + '''a = [x async for x in arange(2)][1]''', + '''a = 1 in {x async for x in arange(2)}''', + '''a = {x:1 async for x in arange(1)}[0]''', + '''a = [x async for x in arange(2) async for x in arange(2)][1]''', + '''a = [x async for x in (x async for x in arange(5))][1]''', + '''a, = [1 for x in {x async for x in arange(1)}]''', + '''a = [await asyncio.sleep(0, x) async for x in arange(2)][1]''' ] policy = maybe_get_event_loop_policy() try: diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-03-12-22-13-50.bpo-39562.E2u273.rst b/Misc/NEWS.d/next/Core and Builtins/2020-03-12-22-13-50.bpo-39562.E2u273.rst new file mode 100644 index 00000000000000..dbe83c6aa19f94 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-03-12-22-13-50.bpo-39562.E2u273.rst @@ -0,0 +1,2 @@ +Allow executing asynchronous comprehensions on the top level when the +``PyCF_ALLOW_TOP_LEVEL_AWAIT`` flag is given. Patch by Batuhan Taskaya. diff --git a/Python/compile.c b/Python/compile.c index 9cc76546308082..913ec992395a06 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -4469,11 +4469,14 @@ compiler_comprehension(struct compiler *c, expr_ty e, int type, PyCodeObject *co = NULL; comprehension_ty outermost; PyObject *qualname = NULL; - int is_async_function = c->u->u_ste->ste_coroutine; int is_async_generator = 0; - outermost = (comprehension_ty) asdl_seq_GET(generators, 0); + if (IS_TOP_LEVEL_AWAIT(c)) { + c->u->u_ste->ste_coroutine = 1; + } + int is_async_function = c->u->u_ste->ste_coroutine; + outermost = (comprehension_ty) asdl_seq_GET(generators, 0); if (!compiler_enter_scope(c, name, COMPILER_SCOPE_COMPREHENSION, (void *)e, e->lineno)) {