]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
annotations: Add tests to check that async comprehensions produce errors (#132513)
authorJelle Zijlstra <jelle.zijlstra@gmail.com>
Mon, 21 Apr 2025 14:06:33 +0000 (07:06 -0700)
committerGitHub <noreply@github.com>
Mon, 21 Apr 2025 14:06:33 +0000 (07:06 -0700)
This already works correctly but I forgot to test for it.

Lib/test/test_type_annotations.py

index 31df7668db0976bafdf2b5c1f793376cf35c82fa..f903f9bb51f9193eb31788b82b82a2930c4534d4 100644 (file)
@@ -387,10 +387,21 @@ class DeferredEvaluationTests(unittest.TestCase):
         self.assertEqual(Outer.__annotations__, {"x": Outer.Nested})
 
     def test_no_exotic_expressions(self):
-        check_syntax_error(self, "def func(x: (yield)): ...", "yield expression cannot be used within an annotation")
-        check_syntax_error(self, "def func(x: (yield from x)): ...", "yield expression cannot be used within an annotation")
-        check_syntax_error(self, "def func(x: (y := 3)): ...", "named expression cannot be used within an annotation")
-        check_syntax_error(self, "def func(x: (await 42)): ...", "await expression cannot be used within an annotation")
+        preludes = [
+            "",
+            "class X:\n ",
+            "def f():\n ",
+            "async def f():\n ",
+        ]
+        for prelude in preludes:
+            with self.subTest(prelude=prelude):
+                check_syntax_error(self, prelude + "def func(x: (yield)): ...", "yield expression cannot be used within an annotation")
+                check_syntax_error(self, prelude + "def func(x: (yield from x)): ...", "yield expression cannot be used within an annotation")
+                check_syntax_error(self, prelude + "def func(x: (y := 3)): ...", "named expression cannot be used within an annotation")
+                check_syntax_error(self, prelude + "def func(x: (await 42)): ...", "await expression cannot be used within an annotation")
+                check_syntax_error(self, prelude + "def func(x: [y async for y in x]): ...", "asynchronous comprehension outside of an asynchronous function")
+                check_syntax_error(self, prelude + "def func(x: {y async for y in x}): ...", "asynchronous comprehension outside of an asynchronous function")
+                check_syntax_error(self, prelude + "def func(x: {y: y async for y in x}): ...", "asynchronous comprehension outside of an asynchronous function")
 
     def test_no_exotic_expressions_in_unevaluated_annotations(self):
         preludes = [
@@ -406,6 +417,9 @@ class DeferredEvaluationTests(unittest.TestCase):
                 check_syntax_error(self, prelude + "(x): (y := 3)", "named expression cannot be used within an annotation")
                 check_syntax_error(self, prelude + "(x): (__debug__ := 3)", "named expression cannot be used within an annotation")
                 check_syntax_error(self, prelude + "(x): (await 42)", "await expression cannot be used within an annotation")
+                check_syntax_error(self, prelude + "(x): [y async for y in x]", "asynchronous comprehension outside of an asynchronous function")
+                check_syntax_error(self, prelude + "(x): {y async for y in x}", "asynchronous comprehension outside of an asynchronous function")
+                check_syntax_error(self, prelude + "(x): {y: y async for y in x}", "asynchronous comprehension outside of an asynchronous function")
 
     def test_ignore_non_simple_annotations(self):
         ns = run_code("class X: (y): int")