]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-39562: Allow executing asynchronous comprehensions in the asyncio REPL (GH-18968)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Thu, 19 Mar 2020 11:54:16 +0000 (04:54 -0700)
committerGitHub <noreply@github.com>
Thu, 19 Mar 2020 11:54:16 +0000 (04:54 -0700)
Co-authored-by: Pablo Galindo <Pablogsal@gmail.com>
(cherry picked from commit 9052f7a41b90f2d34011c8da68f9a4facebc8a97)

Co-authored-by: Batuhan Taşkaya <47358913+isidentical@users.noreply.github.com>
Lib/test/test_builtin.py
Misc/NEWS.d/next/Core and Builtins/2020-03-12-22-13-50.bpo-39562.E2u273.rst [new file with mode: 0644]
Python/compile.c

index 0d241587a869089784fd366929ea7c5962df60b9..f680e02fdf52044e831d97018c5e9c8b8991e338 100644 (file)
@@ -390,7 +390,14 @@ class BuiltinTest(unittest.TestCase):
             '''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 (file)
index 0000000..dbe83c6
--- /dev/null
@@ -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.
index 9cc765463080823ff04064bfc390dfaf1d29028f..913ec992395a06a8f7712c086d2956af36370066 100644 (file)
@@ -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))
     {