17db96d56Sopenharmony_ci"""This module tests SyntaxErrors. 27db96d56Sopenharmony_ci 37db96d56Sopenharmony_ciHere's an example of the sort of thing that is tested. 47db96d56Sopenharmony_ci 57db96d56Sopenharmony_ci>>> def f(x): 67db96d56Sopenharmony_ci... global x 77db96d56Sopenharmony_ciTraceback (most recent call last): 87db96d56Sopenharmony_ciSyntaxError: name 'x' is parameter and global 97db96d56Sopenharmony_ci 107db96d56Sopenharmony_ciThe tests are all raise SyntaxErrors. They were created by checking 117db96d56Sopenharmony_cieach C call that raises SyntaxError. There are several modules that 127db96d56Sopenharmony_ciraise these exceptions-- ast.c, compile.c, future.c, pythonrun.c, and 137db96d56Sopenharmony_cisymtable.c. 147db96d56Sopenharmony_ci 157db96d56Sopenharmony_ciThe parser itself outlaws a lot of invalid syntax. None of these 167db96d56Sopenharmony_cierrors are tested here at the moment. We should add some tests; since 177db96d56Sopenharmony_cithere are infinitely many programs with invalid syntax, we would need 187db96d56Sopenharmony_cito be judicious in selecting some. 197db96d56Sopenharmony_ci 207db96d56Sopenharmony_ciThe compiler generates a synthetic module name for code executed by 217db96d56Sopenharmony_cidoctest. Since all the code comes from the same module, a suffix like 227db96d56Sopenharmony_ci[1] is appended to the module name, As a consequence, changing the 237db96d56Sopenharmony_ciorder of tests in this module means renumbering all the errors after 247db96d56Sopenharmony_ciit. (Maybe we should enable the ellipsis option for these tests.) 257db96d56Sopenharmony_ci 267db96d56Sopenharmony_ciIn ast.c, syntax errors are raised by calling ast_error(). 277db96d56Sopenharmony_ci 287db96d56Sopenharmony_ciErrors from set_context(): 297db96d56Sopenharmony_ci 307db96d56Sopenharmony_ci>>> obj.None = 1 317db96d56Sopenharmony_ciTraceback (most recent call last): 327db96d56Sopenharmony_ciSyntaxError: invalid syntax 337db96d56Sopenharmony_ci 347db96d56Sopenharmony_ci>>> None = 1 357db96d56Sopenharmony_ciTraceback (most recent call last): 367db96d56Sopenharmony_ciSyntaxError: cannot assign to None 377db96d56Sopenharmony_ci 387db96d56Sopenharmony_ci>>> obj.True = 1 397db96d56Sopenharmony_ciTraceback (most recent call last): 407db96d56Sopenharmony_ciSyntaxError: invalid syntax 417db96d56Sopenharmony_ci 427db96d56Sopenharmony_ci>>> True = 1 437db96d56Sopenharmony_ciTraceback (most recent call last): 447db96d56Sopenharmony_ciSyntaxError: cannot assign to True 457db96d56Sopenharmony_ci 467db96d56Sopenharmony_ci>>> (True := 1) 477db96d56Sopenharmony_ciTraceback (most recent call last): 487db96d56Sopenharmony_ciSyntaxError: cannot use assignment expressions with True 497db96d56Sopenharmony_ci 507db96d56Sopenharmony_ci>>> obj.__debug__ = 1 517db96d56Sopenharmony_ciTraceback (most recent call last): 527db96d56Sopenharmony_ciSyntaxError: cannot assign to __debug__ 537db96d56Sopenharmony_ci 547db96d56Sopenharmony_ci>>> __debug__ = 1 557db96d56Sopenharmony_ciTraceback (most recent call last): 567db96d56Sopenharmony_ciSyntaxError: cannot assign to __debug__ 577db96d56Sopenharmony_ci 587db96d56Sopenharmony_ci>>> (__debug__ := 1) 597db96d56Sopenharmony_ciTraceback (most recent call last): 607db96d56Sopenharmony_ciSyntaxError: cannot assign to __debug__ 617db96d56Sopenharmony_ci 627db96d56Sopenharmony_ci>>> del __debug__ 637db96d56Sopenharmony_ciTraceback (most recent call last): 647db96d56Sopenharmony_ciSyntaxError: cannot delete __debug__ 657db96d56Sopenharmony_ci 667db96d56Sopenharmony_ci>>> f() = 1 677db96d56Sopenharmony_ciTraceback (most recent call last): 687db96d56Sopenharmony_ciSyntaxError: cannot assign to function call here. Maybe you meant '==' instead of '='? 697db96d56Sopenharmony_ci 707db96d56Sopenharmony_ci>>> yield = 1 717db96d56Sopenharmony_ciTraceback (most recent call last): 727db96d56Sopenharmony_ciSyntaxError: assignment to yield expression not possible 737db96d56Sopenharmony_ci 747db96d56Sopenharmony_ci>>> del f() 757db96d56Sopenharmony_ciTraceback (most recent call last): 767db96d56Sopenharmony_ciSyntaxError: cannot delete function call 777db96d56Sopenharmony_ci 787db96d56Sopenharmony_ci>>> a + 1 = 2 797db96d56Sopenharmony_ciTraceback (most recent call last): 807db96d56Sopenharmony_ciSyntaxError: cannot assign to expression here. Maybe you meant '==' instead of '='? 817db96d56Sopenharmony_ci 827db96d56Sopenharmony_ci>>> (x for x in x) = 1 837db96d56Sopenharmony_ciTraceback (most recent call last): 847db96d56Sopenharmony_ciSyntaxError: cannot assign to generator expression 857db96d56Sopenharmony_ci 867db96d56Sopenharmony_ci>>> 1 = 1 877db96d56Sopenharmony_ciTraceback (most recent call last): 887db96d56Sopenharmony_ciSyntaxError: cannot assign to literal here. Maybe you meant '==' instead of '='? 897db96d56Sopenharmony_ci 907db96d56Sopenharmony_ci>>> "abc" = 1 917db96d56Sopenharmony_ciTraceback (most recent call last): 927db96d56Sopenharmony_ciSyntaxError: cannot assign to literal here. Maybe you meant '==' instead of '='? 937db96d56Sopenharmony_ci 947db96d56Sopenharmony_ci>>> b"" = 1 957db96d56Sopenharmony_ciTraceback (most recent call last): 967db96d56Sopenharmony_ciSyntaxError: cannot assign to literal here. Maybe you meant '==' instead of '='? 977db96d56Sopenharmony_ci 987db96d56Sopenharmony_ci>>> ... = 1 997db96d56Sopenharmony_ciTraceback (most recent call last): 1007db96d56Sopenharmony_ciSyntaxError: cannot assign to ellipsis here. Maybe you meant '==' instead of '='? 1017db96d56Sopenharmony_ci 1027db96d56Sopenharmony_ci>>> `1` = 1 1037db96d56Sopenharmony_ciTraceback (most recent call last): 1047db96d56Sopenharmony_ciSyntaxError: invalid syntax 1057db96d56Sopenharmony_ci 1067db96d56Sopenharmony_ciIf the left-hand side of an assignment is a list or tuple, an illegal 1077db96d56Sopenharmony_ciexpression inside that contain should still cause a syntax error. 1087db96d56Sopenharmony_ciThis test just checks a couple of cases rather than enumerating all of 1097db96d56Sopenharmony_cithem. 1107db96d56Sopenharmony_ci 1117db96d56Sopenharmony_ci>>> (a, "b", c) = (1, 2, 3) 1127db96d56Sopenharmony_ciTraceback (most recent call last): 1137db96d56Sopenharmony_ciSyntaxError: cannot assign to literal 1147db96d56Sopenharmony_ci 1157db96d56Sopenharmony_ci>>> (a, True, c) = (1, 2, 3) 1167db96d56Sopenharmony_ciTraceback (most recent call last): 1177db96d56Sopenharmony_ciSyntaxError: cannot assign to True 1187db96d56Sopenharmony_ci 1197db96d56Sopenharmony_ci>>> (a, __debug__, c) = (1, 2, 3) 1207db96d56Sopenharmony_ciTraceback (most recent call last): 1217db96d56Sopenharmony_ciSyntaxError: cannot assign to __debug__ 1227db96d56Sopenharmony_ci 1237db96d56Sopenharmony_ci>>> (a, *True, c) = (1, 2, 3) 1247db96d56Sopenharmony_ciTraceback (most recent call last): 1257db96d56Sopenharmony_ciSyntaxError: cannot assign to True 1267db96d56Sopenharmony_ci 1277db96d56Sopenharmony_ci>>> (a, *__debug__, c) = (1, 2, 3) 1287db96d56Sopenharmony_ciTraceback (most recent call last): 1297db96d56Sopenharmony_ciSyntaxError: cannot assign to __debug__ 1307db96d56Sopenharmony_ci 1317db96d56Sopenharmony_ci>>> [a, b, c + 1] = [1, 2, 3] 1327db96d56Sopenharmony_ciTraceback (most recent call last): 1337db96d56Sopenharmony_ciSyntaxError: cannot assign to expression 1347db96d56Sopenharmony_ci 1357db96d56Sopenharmony_ci>>> [a, b[1], c + 1] = [1, 2, 3] 1367db96d56Sopenharmony_ciTraceback (most recent call last): 1377db96d56Sopenharmony_ciSyntaxError: cannot assign to expression 1387db96d56Sopenharmony_ci 1397db96d56Sopenharmony_ci>>> [a, b.c.d, c + 1] = [1, 2, 3] 1407db96d56Sopenharmony_ciTraceback (most recent call last): 1417db96d56Sopenharmony_ciSyntaxError: cannot assign to expression 1427db96d56Sopenharmony_ci 1437db96d56Sopenharmony_ci>>> a if 1 else b = 1 1447db96d56Sopenharmony_ciTraceback (most recent call last): 1457db96d56Sopenharmony_ciSyntaxError: cannot assign to conditional expression 1467db96d56Sopenharmony_ci 1477db96d56Sopenharmony_ci>>> a = 42 if True 1487db96d56Sopenharmony_ciTraceback (most recent call last): 1497db96d56Sopenharmony_ciSyntaxError: expected 'else' after 'if' expression 1507db96d56Sopenharmony_ci 1517db96d56Sopenharmony_ci>>> a = (42 if True) 1527db96d56Sopenharmony_ciTraceback (most recent call last): 1537db96d56Sopenharmony_ciSyntaxError: expected 'else' after 'if' expression 1547db96d56Sopenharmony_ci 1557db96d56Sopenharmony_ci>>> a = [1, 42 if True, 4] 1567db96d56Sopenharmony_ciTraceback (most recent call last): 1577db96d56Sopenharmony_ciSyntaxError: expected 'else' after 'if' expression 1587db96d56Sopenharmony_ci 1597db96d56Sopenharmony_ci>>> if True: 1607db96d56Sopenharmony_ci... print("Hello" 1617db96d56Sopenharmony_ci... 1627db96d56Sopenharmony_ci... if 2: 1637db96d56Sopenharmony_ci... print(123)) 1647db96d56Sopenharmony_ciTraceback (most recent call last): 1657db96d56Sopenharmony_ciSyntaxError: invalid syntax 1667db96d56Sopenharmony_ci 1677db96d56Sopenharmony_ci>>> True = True = 3 1687db96d56Sopenharmony_ciTraceback (most recent call last): 1697db96d56Sopenharmony_ciSyntaxError: cannot assign to True 1707db96d56Sopenharmony_ci 1717db96d56Sopenharmony_ci>>> x = y = True = z = 3 1727db96d56Sopenharmony_ciTraceback (most recent call last): 1737db96d56Sopenharmony_ciSyntaxError: cannot assign to True 1747db96d56Sopenharmony_ci 1757db96d56Sopenharmony_ci>>> x = y = yield = 1 1767db96d56Sopenharmony_ciTraceback (most recent call last): 1777db96d56Sopenharmony_ciSyntaxError: assignment to yield expression not possible 1787db96d56Sopenharmony_ci 1797db96d56Sopenharmony_ci>>> a, b += 1, 2 1807db96d56Sopenharmony_ciTraceback (most recent call last): 1817db96d56Sopenharmony_ciSyntaxError: 'tuple' is an illegal expression for augmented assignment 1827db96d56Sopenharmony_ci 1837db96d56Sopenharmony_ci>>> (a, b) += 1, 2 1847db96d56Sopenharmony_ciTraceback (most recent call last): 1857db96d56Sopenharmony_ciSyntaxError: 'tuple' is an illegal expression for augmented assignment 1867db96d56Sopenharmony_ci 1877db96d56Sopenharmony_ci>>> [a, b] += 1, 2 1887db96d56Sopenharmony_ciTraceback (most recent call last): 1897db96d56Sopenharmony_ciSyntaxError: 'list' is an illegal expression for augmented assignment 1907db96d56Sopenharmony_ci 1917db96d56Sopenharmony_ciInvalid targets in `for` loops and `with` statements should also 1927db96d56Sopenharmony_ciproduce a specialized error message 1937db96d56Sopenharmony_ci 1947db96d56Sopenharmony_ci>>> for a() in b: pass 1957db96d56Sopenharmony_ciTraceback (most recent call last): 1967db96d56Sopenharmony_ciSyntaxError: cannot assign to function call 1977db96d56Sopenharmony_ci 1987db96d56Sopenharmony_ci>>> for (a, b()) in b: pass 1997db96d56Sopenharmony_ciTraceback (most recent call last): 2007db96d56Sopenharmony_ciSyntaxError: cannot assign to function call 2017db96d56Sopenharmony_ci 2027db96d56Sopenharmony_ci>>> for [a, b()] in b: pass 2037db96d56Sopenharmony_ciTraceback (most recent call last): 2047db96d56Sopenharmony_ciSyntaxError: cannot assign to function call 2057db96d56Sopenharmony_ci 2067db96d56Sopenharmony_ci>>> for (*a, b, c+1) in b: pass 2077db96d56Sopenharmony_ciTraceback (most recent call last): 2087db96d56Sopenharmony_ciSyntaxError: cannot assign to expression 2097db96d56Sopenharmony_ci 2107db96d56Sopenharmony_ci>>> for (x, *(y, z.d())) in b: pass 2117db96d56Sopenharmony_ciTraceback (most recent call last): 2127db96d56Sopenharmony_ciSyntaxError: cannot assign to function call 2137db96d56Sopenharmony_ci 2147db96d56Sopenharmony_ci>>> for a, b() in c: pass 2157db96d56Sopenharmony_ciTraceback (most recent call last): 2167db96d56Sopenharmony_ciSyntaxError: cannot assign to function call 2177db96d56Sopenharmony_ci 2187db96d56Sopenharmony_ci>>> for a, b, (c + 1, d()): pass 2197db96d56Sopenharmony_ciTraceback (most recent call last): 2207db96d56Sopenharmony_ciSyntaxError: cannot assign to expression 2217db96d56Sopenharmony_ci 2227db96d56Sopenharmony_ci>>> for i < (): pass 2237db96d56Sopenharmony_ciTraceback (most recent call last): 2247db96d56Sopenharmony_ciSyntaxError: invalid syntax 2257db96d56Sopenharmony_ci 2267db96d56Sopenharmony_ci>>> for a, b 2277db96d56Sopenharmony_ciTraceback (most recent call last): 2287db96d56Sopenharmony_ciSyntaxError: invalid syntax 2297db96d56Sopenharmony_ci 2307db96d56Sopenharmony_ci>>> with a as b(): pass 2317db96d56Sopenharmony_ciTraceback (most recent call last): 2327db96d56Sopenharmony_ciSyntaxError: cannot assign to function call 2337db96d56Sopenharmony_ci 2347db96d56Sopenharmony_ci>>> with a as (b, c()): pass 2357db96d56Sopenharmony_ciTraceback (most recent call last): 2367db96d56Sopenharmony_ciSyntaxError: cannot assign to function call 2377db96d56Sopenharmony_ci 2387db96d56Sopenharmony_ci>>> with a as [b, c()]: pass 2397db96d56Sopenharmony_ciTraceback (most recent call last): 2407db96d56Sopenharmony_ciSyntaxError: cannot assign to function call 2417db96d56Sopenharmony_ci 2427db96d56Sopenharmony_ci>>> with a as (*b, c, d+1): pass 2437db96d56Sopenharmony_ciTraceback (most recent call last): 2447db96d56Sopenharmony_ciSyntaxError: cannot assign to expression 2457db96d56Sopenharmony_ci 2467db96d56Sopenharmony_ci>>> with a as (x, *(y, z.d())): pass 2477db96d56Sopenharmony_ciTraceback (most recent call last): 2487db96d56Sopenharmony_ciSyntaxError: cannot assign to function call 2497db96d56Sopenharmony_ci 2507db96d56Sopenharmony_ci>>> with a as b, c as d(): pass 2517db96d56Sopenharmony_ciTraceback (most recent call last): 2527db96d56Sopenharmony_ciSyntaxError: cannot assign to function call 2537db96d56Sopenharmony_ci 2547db96d56Sopenharmony_ci>>> with a as b 2557db96d56Sopenharmony_ciTraceback (most recent call last): 2567db96d56Sopenharmony_ciSyntaxError: expected ':' 2577db96d56Sopenharmony_ci 2587db96d56Sopenharmony_ci>>> p = p = 2597db96d56Sopenharmony_ciTraceback (most recent call last): 2607db96d56Sopenharmony_ciSyntaxError: invalid syntax 2617db96d56Sopenharmony_ci 2627db96d56Sopenharmony_ciComprehensions creating tuples without parentheses 2637db96d56Sopenharmony_cishould produce a specialized error message: 2647db96d56Sopenharmony_ci 2657db96d56Sopenharmony_ci>>> [x,y for x,y in range(100)] 2667db96d56Sopenharmony_ciTraceback (most recent call last): 2677db96d56Sopenharmony_ciSyntaxError: did you forget parentheses around the comprehension target? 2687db96d56Sopenharmony_ci 2697db96d56Sopenharmony_ci>>> {x,y for x,y in range(100)} 2707db96d56Sopenharmony_ciTraceback (most recent call last): 2717db96d56Sopenharmony_ciSyntaxError: did you forget parentheses around the comprehension target? 2727db96d56Sopenharmony_ci 2737db96d56Sopenharmony_ci# Missing commas in literals collections should not 2747db96d56Sopenharmony_ci# produce special error messages regarding missing 2757db96d56Sopenharmony_ci# parentheses, but about missing commas instead 2767db96d56Sopenharmony_ci 2777db96d56Sopenharmony_ci>>> [1, 2 3] 2787db96d56Sopenharmony_ciTraceback (most recent call last): 2797db96d56Sopenharmony_ciSyntaxError: invalid syntax. Perhaps you forgot a comma? 2807db96d56Sopenharmony_ci 2817db96d56Sopenharmony_ci>>> {1, 2 3} 2827db96d56Sopenharmony_ciTraceback (most recent call last): 2837db96d56Sopenharmony_ciSyntaxError: invalid syntax. Perhaps you forgot a comma? 2847db96d56Sopenharmony_ci 2857db96d56Sopenharmony_ci>>> {1:2, 2:5 3:12} 2867db96d56Sopenharmony_ciTraceback (most recent call last): 2877db96d56Sopenharmony_ciSyntaxError: invalid syntax. Perhaps you forgot a comma? 2887db96d56Sopenharmony_ci 2897db96d56Sopenharmony_ci>>> (1, 2 3) 2907db96d56Sopenharmony_ciTraceback (most recent call last): 2917db96d56Sopenharmony_ciSyntaxError: invalid syntax. Perhaps you forgot a comma? 2927db96d56Sopenharmony_ci 2937db96d56Sopenharmony_ci# Make sure soft keywords constructs don't raise specialized 2947db96d56Sopenharmony_ci# errors regarding missing commas or other spezialiced errors 2957db96d56Sopenharmony_ci 2967db96d56Sopenharmony_ci>>> match x: 2977db96d56Sopenharmony_ci... y = 3 2987db96d56Sopenharmony_ciTraceback (most recent call last): 2997db96d56Sopenharmony_ciSyntaxError: invalid syntax 3007db96d56Sopenharmony_ci 3017db96d56Sopenharmony_ci>>> match x: 3027db96d56Sopenharmony_ci... case y: 3037db96d56Sopenharmony_ci... 3 $ 3 3047db96d56Sopenharmony_ciTraceback (most recent call last): 3057db96d56Sopenharmony_ciSyntaxError: invalid syntax 3067db96d56Sopenharmony_ci 3077db96d56Sopenharmony_ci>>> match x: 3087db96d56Sopenharmony_ci... case $: 3097db96d56Sopenharmony_ci... ... 3107db96d56Sopenharmony_ciTraceback (most recent call last): 3117db96d56Sopenharmony_ciSyntaxError: invalid syntax 3127db96d56Sopenharmony_ci 3137db96d56Sopenharmony_ci>>> match ...: 3147db96d56Sopenharmony_ci... case {**rest, "key": value}: 3157db96d56Sopenharmony_ci... ... 3167db96d56Sopenharmony_ciTraceback (most recent call last): 3177db96d56Sopenharmony_ciSyntaxError: invalid syntax 3187db96d56Sopenharmony_ci 3197db96d56Sopenharmony_ci>>> match ...: 3207db96d56Sopenharmony_ci... case {**_}: 3217db96d56Sopenharmony_ci... ... 3227db96d56Sopenharmony_ciTraceback (most recent call last): 3237db96d56Sopenharmony_ciSyntaxError: invalid syntax 3247db96d56Sopenharmony_ci 3257db96d56Sopenharmony_ciFrom compiler_complex_args(): 3267db96d56Sopenharmony_ci 3277db96d56Sopenharmony_ci>>> def f(None=1): 3287db96d56Sopenharmony_ci... pass 3297db96d56Sopenharmony_ciTraceback (most recent call last): 3307db96d56Sopenharmony_ciSyntaxError: invalid syntax 3317db96d56Sopenharmony_ci 3327db96d56Sopenharmony_ciFrom ast_for_arguments(): 3337db96d56Sopenharmony_ci 3347db96d56Sopenharmony_ci>>> def f(x, y=1, z): 3357db96d56Sopenharmony_ci... pass 3367db96d56Sopenharmony_ciTraceback (most recent call last): 3377db96d56Sopenharmony_ciSyntaxError: non-default argument follows default argument 3387db96d56Sopenharmony_ci 3397db96d56Sopenharmony_ci>>> def f(x, None): 3407db96d56Sopenharmony_ci... pass 3417db96d56Sopenharmony_ciTraceback (most recent call last): 3427db96d56Sopenharmony_ciSyntaxError: invalid syntax 3437db96d56Sopenharmony_ci 3447db96d56Sopenharmony_ci>>> def f(*None): 3457db96d56Sopenharmony_ci... pass 3467db96d56Sopenharmony_ciTraceback (most recent call last): 3477db96d56Sopenharmony_ciSyntaxError: invalid syntax 3487db96d56Sopenharmony_ci 3497db96d56Sopenharmony_ci>>> def f(**None): 3507db96d56Sopenharmony_ci... pass 3517db96d56Sopenharmony_ciTraceback (most recent call last): 3527db96d56Sopenharmony_ciSyntaxError: invalid syntax 3537db96d56Sopenharmony_ci 3547db96d56Sopenharmony_ci>>> def foo(/,a,b=,c): 3557db96d56Sopenharmony_ci... pass 3567db96d56Sopenharmony_ciTraceback (most recent call last): 3577db96d56Sopenharmony_ciSyntaxError: at least one argument must precede / 3587db96d56Sopenharmony_ci 3597db96d56Sopenharmony_ci>>> def foo(a,/,/,b,c): 3607db96d56Sopenharmony_ci... pass 3617db96d56Sopenharmony_ciTraceback (most recent call last): 3627db96d56Sopenharmony_ciSyntaxError: / may appear only once 3637db96d56Sopenharmony_ci 3647db96d56Sopenharmony_ci>>> def foo(a,/,a1,/,b,c): 3657db96d56Sopenharmony_ci... pass 3667db96d56Sopenharmony_ciTraceback (most recent call last): 3677db96d56Sopenharmony_ciSyntaxError: / may appear only once 3687db96d56Sopenharmony_ci 3697db96d56Sopenharmony_ci>>> def foo(a=1,/,/,*b,/,c): 3707db96d56Sopenharmony_ci... pass 3717db96d56Sopenharmony_ciTraceback (most recent call last): 3727db96d56Sopenharmony_ciSyntaxError: / may appear only once 3737db96d56Sopenharmony_ci 3747db96d56Sopenharmony_ci>>> def foo(a,/,a1=1,/,b,c): 3757db96d56Sopenharmony_ci... pass 3767db96d56Sopenharmony_ciTraceback (most recent call last): 3777db96d56Sopenharmony_ciSyntaxError: / may appear only once 3787db96d56Sopenharmony_ci 3797db96d56Sopenharmony_ci>>> def foo(a,*b,c,/,d,e): 3807db96d56Sopenharmony_ci... pass 3817db96d56Sopenharmony_ciTraceback (most recent call last): 3827db96d56Sopenharmony_ciSyntaxError: / must be ahead of * 3837db96d56Sopenharmony_ci 3847db96d56Sopenharmony_ci>>> def foo(a=1,*b,c=3,/,d,e): 3857db96d56Sopenharmony_ci... pass 3867db96d56Sopenharmony_ciTraceback (most recent call last): 3877db96d56Sopenharmony_ciSyntaxError: / must be ahead of * 3887db96d56Sopenharmony_ci 3897db96d56Sopenharmony_ci>>> def foo(a,*b=3,c): 3907db96d56Sopenharmony_ci... pass 3917db96d56Sopenharmony_ciTraceback (most recent call last): 3927db96d56Sopenharmony_ciSyntaxError: var-positional argument cannot have default value 3937db96d56Sopenharmony_ci 3947db96d56Sopenharmony_ci>>> def foo(a,*b: int=,c): 3957db96d56Sopenharmony_ci... pass 3967db96d56Sopenharmony_ciTraceback (most recent call last): 3977db96d56Sopenharmony_ciSyntaxError: var-positional argument cannot have default value 3987db96d56Sopenharmony_ci 3997db96d56Sopenharmony_ci>>> def foo(a,**b=3): 4007db96d56Sopenharmony_ci... pass 4017db96d56Sopenharmony_ciTraceback (most recent call last): 4027db96d56Sopenharmony_ciSyntaxError: var-keyword argument cannot have default value 4037db96d56Sopenharmony_ci 4047db96d56Sopenharmony_ci>>> def foo(a,**b: int=3): 4057db96d56Sopenharmony_ci... pass 4067db96d56Sopenharmony_ciTraceback (most recent call last): 4077db96d56Sopenharmony_ciSyntaxError: var-keyword argument cannot have default value 4087db96d56Sopenharmony_ci 4097db96d56Sopenharmony_ci>>> def foo(a,*a, b, **c, d): 4107db96d56Sopenharmony_ci... pass 4117db96d56Sopenharmony_ciTraceback (most recent call last): 4127db96d56Sopenharmony_ciSyntaxError: arguments cannot follow var-keyword argument 4137db96d56Sopenharmony_ci 4147db96d56Sopenharmony_ci>>> def foo(a,*a, b, **c, d=4): 4157db96d56Sopenharmony_ci... pass 4167db96d56Sopenharmony_ciTraceback (most recent call last): 4177db96d56Sopenharmony_ciSyntaxError: arguments cannot follow var-keyword argument 4187db96d56Sopenharmony_ci 4197db96d56Sopenharmony_ci>>> def foo(a,*a, b, **c, *d): 4207db96d56Sopenharmony_ci... pass 4217db96d56Sopenharmony_ciTraceback (most recent call last): 4227db96d56Sopenharmony_ciSyntaxError: arguments cannot follow var-keyword argument 4237db96d56Sopenharmony_ci 4247db96d56Sopenharmony_ci>>> def foo(a,*a, b, **c, **d): 4257db96d56Sopenharmony_ci... pass 4267db96d56Sopenharmony_ciTraceback (most recent call last): 4277db96d56Sopenharmony_ciSyntaxError: arguments cannot follow var-keyword argument 4287db96d56Sopenharmony_ci 4297db96d56Sopenharmony_ci>>> def foo(a=1,/,**b,/,c): 4307db96d56Sopenharmony_ci... pass 4317db96d56Sopenharmony_ciTraceback (most recent call last): 4327db96d56Sopenharmony_ciSyntaxError: arguments cannot follow var-keyword argument 4337db96d56Sopenharmony_ci 4347db96d56Sopenharmony_ci>>> def foo(*b,*d): 4357db96d56Sopenharmony_ci... pass 4367db96d56Sopenharmony_ciTraceback (most recent call last): 4377db96d56Sopenharmony_ciSyntaxError: * argument may appear only once 4387db96d56Sopenharmony_ci 4397db96d56Sopenharmony_ci>>> def foo(a,*b,c,*d,*e,c): 4407db96d56Sopenharmony_ci... pass 4417db96d56Sopenharmony_ciTraceback (most recent call last): 4427db96d56Sopenharmony_ciSyntaxError: * argument may appear only once 4437db96d56Sopenharmony_ci 4447db96d56Sopenharmony_ci>>> def foo(a,b,/,c,*b,c,*d,*e,c): 4457db96d56Sopenharmony_ci... pass 4467db96d56Sopenharmony_ciTraceback (most recent call last): 4477db96d56Sopenharmony_ciSyntaxError: * argument may appear only once 4487db96d56Sopenharmony_ci 4497db96d56Sopenharmony_ci>>> def foo(a,b,/,c,*b,c,*d,**e): 4507db96d56Sopenharmony_ci... pass 4517db96d56Sopenharmony_ciTraceback (most recent call last): 4527db96d56Sopenharmony_ciSyntaxError: * argument may appear only once 4537db96d56Sopenharmony_ci 4547db96d56Sopenharmony_ci>>> def foo(a=1,/*,b,c): 4557db96d56Sopenharmony_ci... pass 4567db96d56Sopenharmony_ciTraceback (most recent call last): 4577db96d56Sopenharmony_ciSyntaxError: expected comma between / and * 4587db96d56Sopenharmony_ci 4597db96d56Sopenharmony_ci>>> def foo(a=1,d=,c): 4607db96d56Sopenharmony_ci... pass 4617db96d56Sopenharmony_ciTraceback (most recent call last): 4627db96d56Sopenharmony_ciSyntaxError: expected default value expression 4637db96d56Sopenharmony_ci 4647db96d56Sopenharmony_ci>>> def foo(a,d=,c): 4657db96d56Sopenharmony_ci... pass 4667db96d56Sopenharmony_ciTraceback (most recent call last): 4677db96d56Sopenharmony_ciSyntaxError: expected default value expression 4687db96d56Sopenharmony_ci 4697db96d56Sopenharmony_ci>>> def foo(a,d: int=,c): 4707db96d56Sopenharmony_ci... pass 4717db96d56Sopenharmony_ciTraceback (most recent call last): 4727db96d56Sopenharmony_ciSyntaxError: expected default value expression 4737db96d56Sopenharmony_ci 4747db96d56Sopenharmony_ci>>> lambda /,a,b,c: None 4757db96d56Sopenharmony_ciTraceback (most recent call last): 4767db96d56Sopenharmony_ciSyntaxError: at least one argument must precede / 4777db96d56Sopenharmony_ci 4787db96d56Sopenharmony_ci>>> lambda a,/,/,b,c: None 4797db96d56Sopenharmony_ciTraceback (most recent call last): 4807db96d56Sopenharmony_ciSyntaxError: / may appear only once 4817db96d56Sopenharmony_ci 4827db96d56Sopenharmony_ci>>> lambda a,/,a1,/,b,c: None 4837db96d56Sopenharmony_ciTraceback (most recent call last): 4847db96d56Sopenharmony_ciSyntaxError: / may appear only once 4857db96d56Sopenharmony_ci 4867db96d56Sopenharmony_ci>>> lambda a=1,/,/,*b,/,c: None 4877db96d56Sopenharmony_ciTraceback (most recent call last): 4887db96d56Sopenharmony_ciSyntaxError: / may appear only once 4897db96d56Sopenharmony_ci 4907db96d56Sopenharmony_ci>>> lambda a,/,a1=1,/,b,c: None 4917db96d56Sopenharmony_ciTraceback (most recent call last): 4927db96d56Sopenharmony_ciSyntaxError: / may appear only once 4937db96d56Sopenharmony_ci 4947db96d56Sopenharmony_ci>>> lambda a,*b,c,/,d,e: None 4957db96d56Sopenharmony_ciTraceback (most recent call last): 4967db96d56Sopenharmony_ciSyntaxError: / must be ahead of * 4977db96d56Sopenharmony_ci 4987db96d56Sopenharmony_ci>>> lambda a=1,*b,c=3,/,d,e: None 4997db96d56Sopenharmony_ciTraceback (most recent call last): 5007db96d56Sopenharmony_ciSyntaxError: / must be ahead of * 5017db96d56Sopenharmony_ci 5027db96d56Sopenharmony_ci>>> lambda a=1,/*,b,c: None 5037db96d56Sopenharmony_ciTraceback (most recent call last): 5047db96d56Sopenharmony_ciSyntaxError: expected comma between / and * 5057db96d56Sopenharmony_ci 5067db96d56Sopenharmony_ci>>> lambda a,*b=3,c: None 5077db96d56Sopenharmony_ciTraceback (most recent call last): 5087db96d56Sopenharmony_ciSyntaxError: var-positional argument cannot have default value 5097db96d56Sopenharmony_ci 5107db96d56Sopenharmony_ci>>> lambda a,**b=3: None 5117db96d56Sopenharmony_ciTraceback (most recent call last): 5127db96d56Sopenharmony_ciSyntaxError: var-keyword argument cannot have default value 5137db96d56Sopenharmony_ci 5147db96d56Sopenharmony_ci>>> lambda a, *a, b, **c, d: None 5157db96d56Sopenharmony_ciTraceback (most recent call last): 5167db96d56Sopenharmony_ciSyntaxError: arguments cannot follow var-keyword argument 5177db96d56Sopenharmony_ci 5187db96d56Sopenharmony_ci>>> lambda a,*a, b, **c, d=4: None 5197db96d56Sopenharmony_ciTraceback (most recent call last): 5207db96d56Sopenharmony_ciSyntaxError: arguments cannot follow var-keyword argument 5217db96d56Sopenharmony_ci 5227db96d56Sopenharmony_ci>>> lambda a,*a, b, **c, *d: None 5237db96d56Sopenharmony_ciTraceback (most recent call last): 5247db96d56Sopenharmony_ciSyntaxError: arguments cannot follow var-keyword argument 5257db96d56Sopenharmony_ci 5267db96d56Sopenharmony_ci>>> lambda a,*a, b, **c, **d: None 5277db96d56Sopenharmony_ciTraceback (most recent call last): 5287db96d56Sopenharmony_ciSyntaxError: arguments cannot follow var-keyword argument 5297db96d56Sopenharmony_ci 5307db96d56Sopenharmony_ci>>> lambda a=1,/,**b,/,c: None 5317db96d56Sopenharmony_ciTraceback (most recent call last): 5327db96d56Sopenharmony_ciSyntaxError: arguments cannot follow var-keyword argument 5337db96d56Sopenharmony_ci 5347db96d56Sopenharmony_ci>>> lambda *b,*d: None 5357db96d56Sopenharmony_ciTraceback (most recent call last): 5367db96d56Sopenharmony_ciSyntaxError: * argument may appear only once 5377db96d56Sopenharmony_ci 5387db96d56Sopenharmony_ci>>> lambda a,*b,c,*d,*e,c: None 5397db96d56Sopenharmony_ciTraceback (most recent call last): 5407db96d56Sopenharmony_ciSyntaxError: * argument may appear only once 5417db96d56Sopenharmony_ci 5427db96d56Sopenharmony_ci>>> lambda a,b,/,c,*b,c,*d,*e,c: None 5437db96d56Sopenharmony_ciTraceback (most recent call last): 5447db96d56Sopenharmony_ciSyntaxError: * argument may appear only once 5457db96d56Sopenharmony_ci 5467db96d56Sopenharmony_ci>>> lambda a,b,/,c,*b,c,*d,**e: None 5477db96d56Sopenharmony_ciTraceback (most recent call last): 5487db96d56Sopenharmony_ciSyntaxError: * argument may appear only once 5497db96d56Sopenharmony_ci 5507db96d56Sopenharmony_ci>>> lambda a=1,d=,c: None 5517db96d56Sopenharmony_ciTraceback (most recent call last): 5527db96d56Sopenharmony_ciSyntaxError: expected default value expression 5537db96d56Sopenharmony_ci 5547db96d56Sopenharmony_ci>>> lambda a,d=,c: None 5557db96d56Sopenharmony_ciTraceback (most recent call last): 5567db96d56Sopenharmony_ciSyntaxError: expected default value expression 5577db96d56Sopenharmony_ci 5587db96d56Sopenharmony_ci>>> import ast; ast.parse(''' 5597db96d56Sopenharmony_ci... def f( 5607db96d56Sopenharmony_ci... *, # type: int 5617db96d56Sopenharmony_ci... a, # type: int 5627db96d56Sopenharmony_ci... ): 5637db96d56Sopenharmony_ci... pass 5647db96d56Sopenharmony_ci... ''', type_comments=True) 5657db96d56Sopenharmony_ciTraceback (most recent call last): 5667db96d56Sopenharmony_ciSyntaxError: bare * has associated type comment 5677db96d56Sopenharmony_ci 5687db96d56Sopenharmony_ci 5697db96d56Sopenharmony_ciFrom ast_for_funcdef(): 5707db96d56Sopenharmony_ci 5717db96d56Sopenharmony_ci>>> def None(x): 5727db96d56Sopenharmony_ci... pass 5737db96d56Sopenharmony_ciTraceback (most recent call last): 5747db96d56Sopenharmony_ciSyntaxError: invalid syntax 5757db96d56Sopenharmony_ci 5767db96d56Sopenharmony_ci 5777db96d56Sopenharmony_ciFrom ast_for_call(): 5787db96d56Sopenharmony_ci 5797db96d56Sopenharmony_ci>>> def f(it, *varargs, **kwargs): 5807db96d56Sopenharmony_ci... return list(it) 5817db96d56Sopenharmony_ci>>> L = range(10) 5827db96d56Sopenharmony_ci>>> f(x for x in L) 5837db96d56Sopenharmony_ci[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 5847db96d56Sopenharmony_ci>>> f(x for x in L, 1) 5857db96d56Sopenharmony_ciTraceback (most recent call last): 5867db96d56Sopenharmony_ciSyntaxError: Generator expression must be parenthesized 5877db96d56Sopenharmony_ci>>> f(x for x in L, y=1) 5887db96d56Sopenharmony_ciTraceback (most recent call last): 5897db96d56Sopenharmony_ciSyntaxError: Generator expression must be parenthesized 5907db96d56Sopenharmony_ci>>> f(x for x in L, *[]) 5917db96d56Sopenharmony_ciTraceback (most recent call last): 5927db96d56Sopenharmony_ciSyntaxError: Generator expression must be parenthesized 5937db96d56Sopenharmony_ci>>> f(x for x in L, **{}) 5947db96d56Sopenharmony_ciTraceback (most recent call last): 5957db96d56Sopenharmony_ciSyntaxError: Generator expression must be parenthesized 5967db96d56Sopenharmony_ci>>> f(L, x for x in L) 5977db96d56Sopenharmony_ciTraceback (most recent call last): 5987db96d56Sopenharmony_ciSyntaxError: Generator expression must be parenthesized 5997db96d56Sopenharmony_ci>>> f(x for x in L, y for y in L) 6007db96d56Sopenharmony_ciTraceback (most recent call last): 6017db96d56Sopenharmony_ciSyntaxError: Generator expression must be parenthesized 6027db96d56Sopenharmony_ci>>> f(x for x in L,) 6037db96d56Sopenharmony_ciTraceback (most recent call last): 6047db96d56Sopenharmony_ciSyntaxError: Generator expression must be parenthesized 6057db96d56Sopenharmony_ci>>> f((x for x in L), 1) 6067db96d56Sopenharmony_ci[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 6077db96d56Sopenharmony_ci>>> class C(x for x in L): 6087db96d56Sopenharmony_ci... pass 6097db96d56Sopenharmony_ciTraceback (most recent call last): 6107db96d56Sopenharmony_ciSyntaxError: invalid syntax 6117db96d56Sopenharmony_ci 6127db96d56Sopenharmony_ci>>> def g(*args, **kwargs): 6137db96d56Sopenharmony_ci... print(args, sorted(kwargs.items())) 6147db96d56Sopenharmony_ci>>> g(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 6157db96d56Sopenharmony_ci... 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 6167db96d56Sopenharmony_ci... 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 6177db96d56Sopenharmony_ci... 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 6187db96d56Sopenharmony_ci... 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 6197db96d56Sopenharmony_ci... 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 6207db96d56Sopenharmony_ci... 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 6217db96d56Sopenharmony_ci... 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 6227db96d56Sopenharmony_ci... 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 6237db96d56Sopenharmony_ci... 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 6247db96d56Sopenharmony_ci... 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 6257db96d56Sopenharmony_ci... 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 6267db96d56Sopenharmony_ci... 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 6277db96d56Sopenharmony_ci... 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 6287db96d56Sopenharmony_ci... 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 6297db96d56Sopenharmony_ci... 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 6307db96d56Sopenharmony_ci... 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 6317db96d56Sopenharmony_ci... 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 6327db96d56Sopenharmony_ci... 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 6337db96d56Sopenharmony_ci... 290, 291, 292, 293, 294, 295, 296, 297, 298, 299) # doctest: +ELLIPSIS 6347db96d56Sopenharmony_ci(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ..., 297, 298, 299) [] 6357db96d56Sopenharmony_ci 6367db96d56Sopenharmony_ci>>> g(a000=0, a001=1, a002=2, a003=3, a004=4, a005=5, a006=6, a007=7, a008=8, 6377db96d56Sopenharmony_ci... a009=9, a010=10, a011=11, a012=12, a013=13, a014=14, a015=15, a016=16, 6387db96d56Sopenharmony_ci... a017=17, a018=18, a019=19, a020=20, a021=21, a022=22, a023=23, a024=24, 6397db96d56Sopenharmony_ci... a025=25, a026=26, a027=27, a028=28, a029=29, a030=30, a031=31, a032=32, 6407db96d56Sopenharmony_ci... a033=33, a034=34, a035=35, a036=36, a037=37, a038=38, a039=39, a040=40, 6417db96d56Sopenharmony_ci... a041=41, a042=42, a043=43, a044=44, a045=45, a046=46, a047=47, a048=48, 6427db96d56Sopenharmony_ci... a049=49, a050=50, a051=51, a052=52, a053=53, a054=54, a055=55, a056=56, 6437db96d56Sopenharmony_ci... a057=57, a058=58, a059=59, a060=60, a061=61, a062=62, a063=63, a064=64, 6447db96d56Sopenharmony_ci... a065=65, a066=66, a067=67, a068=68, a069=69, a070=70, a071=71, a072=72, 6457db96d56Sopenharmony_ci... a073=73, a074=74, a075=75, a076=76, a077=77, a078=78, a079=79, a080=80, 6467db96d56Sopenharmony_ci... a081=81, a082=82, a083=83, a084=84, a085=85, a086=86, a087=87, a088=88, 6477db96d56Sopenharmony_ci... a089=89, a090=90, a091=91, a092=92, a093=93, a094=94, a095=95, a096=96, 6487db96d56Sopenharmony_ci... a097=97, a098=98, a099=99, a100=100, a101=101, a102=102, a103=103, 6497db96d56Sopenharmony_ci... a104=104, a105=105, a106=106, a107=107, a108=108, a109=109, a110=110, 6507db96d56Sopenharmony_ci... a111=111, a112=112, a113=113, a114=114, a115=115, a116=116, a117=117, 6517db96d56Sopenharmony_ci... a118=118, a119=119, a120=120, a121=121, a122=122, a123=123, a124=124, 6527db96d56Sopenharmony_ci... a125=125, a126=126, a127=127, a128=128, a129=129, a130=130, a131=131, 6537db96d56Sopenharmony_ci... a132=132, a133=133, a134=134, a135=135, a136=136, a137=137, a138=138, 6547db96d56Sopenharmony_ci... a139=139, a140=140, a141=141, a142=142, a143=143, a144=144, a145=145, 6557db96d56Sopenharmony_ci... a146=146, a147=147, a148=148, a149=149, a150=150, a151=151, a152=152, 6567db96d56Sopenharmony_ci... a153=153, a154=154, a155=155, a156=156, a157=157, a158=158, a159=159, 6577db96d56Sopenharmony_ci... a160=160, a161=161, a162=162, a163=163, a164=164, a165=165, a166=166, 6587db96d56Sopenharmony_ci... a167=167, a168=168, a169=169, a170=170, a171=171, a172=172, a173=173, 6597db96d56Sopenharmony_ci... a174=174, a175=175, a176=176, a177=177, a178=178, a179=179, a180=180, 6607db96d56Sopenharmony_ci... a181=181, a182=182, a183=183, a184=184, a185=185, a186=186, a187=187, 6617db96d56Sopenharmony_ci... a188=188, a189=189, a190=190, a191=191, a192=192, a193=193, a194=194, 6627db96d56Sopenharmony_ci... a195=195, a196=196, a197=197, a198=198, a199=199, a200=200, a201=201, 6637db96d56Sopenharmony_ci... a202=202, a203=203, a204=204, a205=205, a206=206, a207=207, a208=208, 6647db96d56Sopenharmony_ci... a209=209, a210=210, a211=211, a212=212, a213=213, a214=214, a215=215, 6657db96d56Sopenharmony_ci... a216=216, a217=217, a218=218, a219=219, a220=220, a221=221, a222=222, 6667db96d56Sopenharmony_ci... a223=223, a224=224, a225=225, a226=226, a227=227, a228=228, a229=229, 6677db96d56Sopenharmony_ci... a230=230, a231=231, a232=232, a233=233, a234=234, a235=235, a236=236, 6687db96d56Sopenharmony_ci... a237=237, a238=238, a239=239, a240=240, a241=241, a242=242, a243=243, 6697db96d56Sopenharmony_ci... a244=244, a245=245, a246=246, a247=247, a248=248, a249=249, a250=250, 6707db96d56Sopenharmony_ci... a251=251, a252=252, a253=253, a254=254, a255=255, a256=256, a257=257, 6717db96d56Sopenharmony_ci... a258=258, a259=259, a260=260, a261=261, a262=262, a263=263, a264=264, 6727db96d56Sopenharmony_ci... a265=265, a266=266, a267=267, a268=268, a269=269, a270=270, a271=271, 6737db96d56Sopenharmony_ci... a272=272, a273=273, a274=274, a275=275, a276=276, a277=277, a278=278, 6747db96d56Sopenharmony_ci... a279=279, a280=280, a281=281, a282=282, a283=283, a284=284, a285=285, 6757db96d56Sopenharmony_ci... a286=286, a287=287, a288=288, a289=289, a290=290, a291=291, a292=292, 6767db96d56Sopenharmony_ci... a293=293, a294=294, a295=295, a296=296, a297=297, a298=298, a299=299) 6777db96d56Sopenharmony_ci... # doctest: +ELLIPSIS 6787db96d56Sopenharmony_ci() [('a000', 0), ('a001', 1), ('a002', 2), ..., ('a298', 298), ('a299', 299)] 6797db96d56Sopenharmony_ci 6807db96d56Sopenharmony_ci>>> class C: 6817db96d56Sopenharmony_ci... def meth(self, *args): 6827db96d56Sopenharmony_ci... return args 6837db96d56Sopenharmony_ci>>> obj = C() 6847db96d56Sopenharmony_ci>>> obj.meth( 6857db96d56Sopenharmony_ci... 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 6867db96d56Sopenharmony_ci... 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 6877db96d56Sopenharmony_ci... 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 6887db96d56Sopenharmony_ci... 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 6897db96d56Sopenharmony_ci... 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 6907db96d56Sopenharmony_ci... 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 6917db96d56Sopenharmony_ci... 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 6927db96d56Sopenharmony_ci... 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 6937db96d56Sopenharmony_ci... 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 6947db96d56Sopenharmony_ci... 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 6957db96d56Sopenharmony_ci... 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 6967db96d56Sopenharmony_ci... 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 6977db96d56Sopenharmony_ci... 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 6987db96d56Sopenharmony_ci... 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 6997db96d56Sopenharmony_ci... 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 7007db96d56Sopenharmony_ci... 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 7017db96d56Sopenharmony_ci... 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 7027db96d56Sopenharmony_ci... 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 7037db96d56Sopenharmony_ci... 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 7047db96d56Sopenharmony_ci... 290, 291, 292, 293, 294, 295, 296, 297, 298, 299) # doctest: +ELLIPSIS 7057db96d56Sopenharmony_ci(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ..., 297, 298, 299) 7067db96d56Sopenharmony_ci 7077db96d56Sopenharmony_ci>>> f(lambda x: x[0] = 3) 7087db96d56Sopenharmony_ciTraceback (most recent call last): 7097db96d56Sopenharmony_ciSyntaxError: expression cannot contain assignment, perhaps you meant "=="? 7107db96d56Sopenharmony_ci 7117db96d56Sopenharmony_ci# Check that this error doesn't trigger for names: 7127db96d56Sopenharmony_ci>>> f(a={x: for x in {}}) 7137db96d56Sopenharmony_ciTraceback (most recent call last): 7147db96d56Sopenharmony_ciSyntaxError: invalid syntax 7157db96d56Sopenharmony_ci 7167db96d56Sopenharmony_ciThe grammar accepts any test (basically, any expression) in the 7177db96d56Sopenharmony_cikeyword slot of a call site. Test a few different options. 7187db96d56Sopenharmony_ci 7197db96d56Sopenharmony_ci>>> f(x()=2) 7207db96d56Sopenharmony_ciTraceback (most recent call last): 7217db96d56Sopenharmony_ciSyntaxError: expression cannot contain assignment, perhaps you meant "=="? 7227db96d56Sopenharmony_ci>>> f(a or b=1) 7237db96d56Sopenharmony_ciTraceback (most recent call last): 7247db96d56Sopenharmony_ciSyntaxError: expression cannot contain assignment, perhaps you meant "=="? 7257db96d56Sopenharmony_ci>>> f(x.y=1) 7267db96d56Sopenharmony_ciTraceback (most recent call last): 7277db96d56Sopenharmony_ciSyntaxError: expression cannot contain assignment, perhaps you meant "=="? 7287db96d56Sopenharmony_ci>>> f((x)=2) 7297db96d56Sopenharmony_ciTraceback (most recent call last): 7307db96d56Sopenharmony_ciSyntaxError: expression cannot contain assignment, perhaps you meant "=="? 7317db96d56Sopenharmony_ci>>> f(True=1) 7327db96d56Sopenharmony_ciTraceback (most recent call last): 7337db96d56Sopenharmony_ciSyntaxError: cannot assign to True 7347db96d56Sopenharmony_ci>>> f(False=1) 7357db96d56Sopenharmony_ciTraceback (most recent call last): 7367db96d56Sopenharmony_ciSyntaxError: cannot assign to False 7377db96d56Sopenharmony_ci>>> f(None=1) 7387db96d56Sopenharmony_ciTraceback (most recent call last): 7397db96d56Sopenharmony_ciSyntaxError: cannot assign to None 7407db96d56Sopenharmony_ci>>> f(__debug__=1) 7417db96d56Sopenharmony_ciTraceback (most recent call last): 7427db96d56Sopenharmony_ciSyntaxError: cannot assign to __debug__ 7437db96d56Sopenharmony_ci>>> __debug__: int 7447db96d56Sopenharmony_ciTraceback (most recent call last): 7457db96d56Sopenharmony_ciSyntaxError: cannot assign to __debug__ 7467db96d56Sopenharmony_ci 7477db96d56Sopenharmony_ci 7487db96d56Sopenharmony_ciMore set_context(): 7497db96d56Sopenharmony_ci 7507db96d56Sopenharmony_ci>>> (x for x in x) += 1 7517db96d56Sopenharmony_ciTraceback (most recent call last): 7527db96d56Sopenharmony_ciSyntaxError: 'generator expression' is an illegal expression for augmented assignment 7537db96d56Sopenharmony_ci>>> None += 1 7547db96d56Sopenharmony_ciTraceback (most recent call last): 7557db96d56Sopenharmony_ciSyntaxError: 'None' is an illegal expression for augmented assignment 7567db96d56Sopenharmony_ci>>> __debug__ += 1 7577db96d56Sopenharmony_ciTraceback (most recent call last): 7587db96d56Sopenharmony_ciSyntaxError: cannot assign to __debug__ 7597db96d56Sopenharmony_ci>>> f() += 1 7607db96d56Sopenharmony_ciTraceback (most recent call last): 7617db96d56Sopenharmony_ciSyntaxError: 'function call' is an illegal expression for augmented assignment 7627db96d56Sopenharmony_ci 7637db96d56Sopenharmony_ci 7647db96d56Sopenharmony_ciTest continue in finally in weird combinations. 7657db96d56Sopenharmony_ci 7667db96d56Sopenharmony_cicontinue in for loop under finally should be ok. 7677db96d56Sopenharmony_ci 7687db96d56Sopenharmony_ci >>> def test(): 7697db96d56Sopenharmony_ci ... try: 7707db96d56Sopenharmony_ci ... pass 7717db96d56Sopenharmony_ci ... finally: 7727db96d56Sopenharmony_ci ... for abc in range(10): 7737db96d56Sopenharmony_ci ... continue 7747db96d56Sopenharmony_ci ... print(abc) 7757db96d56Sopenharmony_ci >>> test() 7767db96d56Sopenharmony_ci 9 7777db96d56Sopenharmony_ci 7787db96d56Sopenharmony_cicontinue in a finally should be ok. 7797db96d56Sopenharmony_ci 7807db96d56Sopenharmony_ci >>> def test(): 7817db96d56Sopenharmony_ci ... for abc in range(10): 7827db96d56Sopenharmony_ci ... try: 7837db96d56Sopenharmony_ci ... pass 7847db96d56Sopenharmony_ci ... finally: 7857db96d56Sopenharmony_ci ... continue 7867db96d56Sopenharmony_ci ... print(abc) 7877db96d56Sopenharmony_ci >>> test() 7887db96d56Sopenharmony_ci 9 7897db96d56Sopenharmony_ci 7907db96d56Sopenharmony_ci >>> def test(): 7917db96d56Sopenharmony_ci ... for abc in range(10): 7927db96d56Sopenharmony_ci ... try: 7937db96d56Sopenharmony_ci ... pass 7947db96d56Sopenharmony_ci ... finally: 7957db96d56Sopenharmony_ci ... try: 7967db96d56Sopenharmony_ci ... continue 7977db96d56Sopenharmony_ci ... except: 7987db96d56Sopenharmony_ci ... pass 7997db96d56Sopenharmony_ci ... print(abc) 8007db96d56Sopenharmony_ci >>> test() 8017db96d56Sopenharmony_ci 9 8027db96d56Sopenharmony_ci 8037db96d56Sopenharmony_ci >>> def test(): 8047db96d56Sopenharmony_ci ... for abc in range(10): 8057db96d56Sopenharmony_ci ... try: 8067db96d56Sopenharmony_ci ... pass 8077db96d56Sopenharmony_ci ... finally: 8087db96d56Sopenharmony_ci ... try: 8097db96d56Sopenharmony_ci ... pass 8107db96d56Sopenharmony_ci ... except: 8117db96d56Sopenharmony_ci ... continue 8127db96d56Sopenharmony_ci ... print(abc) 8137db96d56Sopenharmony_ci >>> test() 8147db96d56Sopenharmony_ci 9 8157db96d56Sopenharmony_ci 8167db96d56Sopenharmony_ciA continue outside loop should not be allowed. 8177db96d56Sopenharmony_ci 8187db96d56Sopenharmony_ci >>> def foo(): 8197db96d56Sopenharmony_ci ... try: 8207db96d56Sopenharmony_ci ... pass 8217db96d56Sopenharmony_ci ... finally: 8227db96d56Sopenharmony_ci ... continue 8237db96d56Sopenharmony_ci Traceback (most recent call last): 8247db96d56Sopenharmony_ci ... 8257db96d56Sopenharmony_ci SyntaxError: 'continue' not properly in loop 8267db96d56Sopenharmony_ci 8277db96d56Sopenharmony_ciThere is one test for a break that is not in a loop. The compiler 8287db96d56Sopenharmony_ciuses a single data structure to keep track of try-finally and loops, 8297db96d56Sopenharmony_ciso we need to be sure that a break is actually inside a loop. If it 8307db96d56Sopenharmony_ciisn't, there should be a syntax error. 8317db96d56Sopenharmony_ci 8327db96d56Sopenharmony_ci >>> try: 8337db96d56Sopenharmony_ci ... print(1) 8347db96d56Sopenharmony_ci ... break 8357db96d56Sopenharmony_ci ... print(2) 8367db96d56Sopenharmony_ci ... finally: 8377db96d56Sopenharmony_ci ... print(3) 8387db96d56Sopenharmony_ci Traceback (most recent call last): 8397db96d56Sopenharmony_ci ... 8407db96d56Sopenharmony_ci SyntaxError: 'break' outside loop 8417db96d56Sopenharmony_ci 8427db96d56Sopenharmony_ciMisuse of the nonlocal and global statement can lead to a few unique syntax errors. 8437db96d56Sopenharmony_ci 8447db96d56Sopenharmony_ci >>> def f(): 8457db96d56Sopenharmony_ci ... print(x) 8467db96d56Sopenharmony_ci ... global x 8477db96d56Sopenharmony_ci Traceback (most recent call last): 8487db96d56Sopenharmony_ci ... 8497db96d56Sopenharmony_ci SyntaxError: name 'x' is used prior to global declaration 8507db96d56Sopenharmony_ci 8517db96d56Sopenharmony_ci >>> def f(): 8527db96d56Sopenharmony_ci ... x = 1 8537db96d56Sopenharmony_ci ... global x 8547db96d56Sopenharmony_ci Traceback (most recent call last): 8557db96d56Sopenharmony_ci ... 8567db96d56Sopenharmony_ci SyntaxError: name 'x' is assigned to before global declaration 8577db96d56Sopenharmony_ci 8587db96d56Sopenharmony_ci >>> def f(x): 8597db96d56Sopenharmony_ci ... global x 8607db96d56Sopenharmony_ci Traceback (most recent call last): 8617db96d56Sopenharmony_ci ... 8627db96d56Sopenharmony_ci SyntaxError: name 'x' is parameter and global 8637db96d56Sopenharmony_ci 8647db96d56Sopenharmony_ci >>> def f(): 8657db96d56Sopenharmony_ci ... x = 1 8667db96d56Sopenharmony_ci ... def g(): 8677db96d56Sopenharmony_ci ... print(x) 8687db96d56Sopenharmony_ci ... nonlocal x 8697db96d56Sopenharmony_ci Traceback (most recent call last): 8707db96d56Sopenharmony_ci ... 8717db96d56Sopenharmony_ci SyntaxError: name 'x' is used prior to nonlocal declaration 8727db96d56Sopenharmony_ci 8737db96d56Sopenharmony_ci >>> def f(): 8747db96d56Sopenharmony_ci ... x = 1 8757db96d56Sopenharmony_ci ... def g(): 8767db96d56Sopenharmony_ci ... x = 2 8777db96d56Sopenharmony_ci ... nonlocal x 8787db96d56Sopenharmony_ci Traceback (most recent call last): 8797db96d56Sopenharmony_ci ... 8807db96d56Sopenharmony_ci SyntaxError: name 'x' is assigned to before nonlocal declaration 8817db96d56Sopenharmony_ci 8827db96d56Sopenharmony_ci >>> def f(x): 8837db96d56Sopenharmony_ci ... nonlocal x 8847db96d56Sopenharmony_ci Traceback (most recent call last): 8857db96d56Sopenharmony_ci ... 8867db96d56Sopenharmony_ci SyntaxError: name 'x' is parameter and nonlocal 8877db96d56Sopenharmony_ci 8887db96d56Sopenharmony_ci >>> def f(): 8897db96d56Sopenharmony_ci ... global x 8907db96d56Sopenharmony_ci ... nonlocal x 8917db96d56Sopenharmony_ci Traceback (most recent call last): 8927db96d56Sopenharmony_ci ... 8937db96d56Sopenharmony_ci SyntaxError: name 'x' is nonlocal and global 8947db96d56Sopenharmony_ci 8957db96d56Sopenharmony_ci >>> def f(): 8967db96d56Sopenharmony_ci ... nonlocal x 8977db96d56Sopenharmony_ci Traceback (most recent call last): 8987db96d56Sopenharmony_ci ... 8997db96d56Sopenharmony_ci SyntaxError: no binding for nonlocal 'x' found 9007db96d56Sopenharmony_ci 9017db96d56Sopenharmony_ciFrom SF bug #1705365 9027db96d56Sopenharmony_ci >>> nonlocal x 9037db96d56Sopenharmony_ci Traceback (most recent call last): 9047db96d56Sopenharmony_ci ... 9057db96d56Sopenharmony_ci SyntaxError: nonlocal declaration not allowed at module level 9067db96d56Sopenharmony_ci 9077db96d56Sopenharmony_ciFrom https://bugs.python.org/issue25973 9087db96d56Sopenharmony_ci >>> class A: 9097db96d56Sopenharmony_ci ... def f(self): 9107db96d56Sopenharmony_ci ... nonlocal __x 9117db96d56Sopenharmony_ci Traceback (most recent call last): 9127db96d56Sopenharmony_ci ... 9137db96d56Sopenharmony_ci SyntaxError: no binding for nonlocal '_A__x' found 9147db96d56Sopenharmony_ci 9157db96d56Sopenharmony_ci 9167db96d56Sopenharmony_ciThis tests assignment-context; there was a bug in Python 2.5 where compiling 9177db96d56Sopenharmony_cia complex 'if' (one with 'elif') would fail to notice an invalid suite, 9187db96d56Sopenharmony_cileading to spurious errors. 9197db96d56Sopenharmony_ci 9207db96d56Sopenharmony_ci >>> if 1: 9217db96d56Sopenharmony_ci ... x() = 1 9227db96d56Sopenharmony_ci ... elif 1: 9237db96d56Sopenharmony_ci ... pass 9247db96d56Sopenharmony_ci Traceback (most recent call last): 9257db96d56Sopenharmony_ci ... 9267db96d56Sopenharmony_ci SyntaxError: cannot assign to function call here. Maybe you meant '==' instead of '='? 9277db96d56Sopenharmony_ci 9287db96d56Sopenharmony_ci >>> if 1: 9297db96d56Sopenharmony_ci ... pass 9307db96d56Sopenharmony_ci ... elif 1: 9317db96d56Sopenharmony_ci ... x() = 1 9327db96d56Sopenharmony_ci Traceback (most recent call last): 9337db96d56Sopenharmony_ci ... 9347db96d56Sopenharmony_ci SyntaxError: cannot assign to function call here. Maybe you meant '==' instead of '='? 9357db96d56Sopenharmony_ci 9367db96d56Sopenharmony_ci >>> if 1: 9377db96d56Sopenharmony_ci ... x() = 1 9387db96d56Sopenharmony_ci ... elif 1: 9397db96d56Sopenharmony_ci ... pass 9407db96d56Sopenharmony_ci ... else: 9417db96d56Sopenharmony_ci ... pass 9427db96d56Sopenharmony_ci Traceback (most recent call last): 9437db96d56Sopenharmony_ci ... 9447db96d56Sopenharmony_ci SyntaxError: cannot assign to function call here. Maybe you meant '==' instead of '='? 9457db96d56Sopenharmony_ci 9467db96d56Sopenharmony_ci >>> if 1: 9477db96d56Sopenharmony_ci ... pass 9487db96d56Sopenharmony_ci ... elif 1: 9497db96d56Sopenharmony_ci ... x() = 1 9507db96d56Sopenharmony_ci ... else: 9517db96d56Sopenharmony_ci ... pass 9527db96d56Sopenharmony_ci Traceback (most recent call last): 9537db96d56Sopenharmony_ci ... 9547db96d56Sopenharmony_ci SyntaxError: cannot assign to function call here. Maybe you meant '==' instead of '='? 9557db96d56Sopenharmony_ci 9567db96d56Sopenharmony_ci >>> if 1: 9577db96d56Sopenharmony_ci ... pass 9587db96d56Sopenharmony_ci ... elif 1: 9597db96d56Sopenharmony_ci ... pass 9607db96d56Sopenharmony_ci ... else: 9617db96d56Sopenharmony_ci ... x() = 1 9627db96d56Sopenharmony_ci Traceback (most recent call last): 9637db96d56Sopenharmony_ci ... 9647db96d56Sopenharmony_ci SyntaxError: cannot assign to function call here. Maybe you meant '==' instead of '='? 9657db96d56Sopenharmony_ci 9667db96d56Sopenharmony_ciMissing ':' before suites: 9677db96d56Sopenharmony_ci 9687db96d56Sopenharmony_ci >>> def f() 9697db96d56Sopenharmony_ci ... pass 9707db96d56Sopenharmony_ci Traceback (most recent call last): 9717db96d56Sopenharmony_ci SyntaxError: expected ':' 9727db96d56Sopenharmony_ci 9737db96d56Sopenharmony_ci >>> class A 9747db96d56Sopenharmony_ci ... pass 9757db96d56Sopenharmony_ci Traceback (most recent call last): 9767db96d56Sopenharmony_ci SyntaxError: expected ':' 9777db96d56Sopenharmony_ci 9787db96d56Sopenharmony_ci >>> class R&D: 9797db96d56Sopenharmony_ci ... pass 9807db96d56Sopenharmony_ci Traceback (most recent call last): 9817db96d56Sopenharmony_ci SyntaxError: invalid syntax 9827db96d56Sopenharmony_ci 9837db96d56Sopenharmony_ci >>> if 1 9847db96d56Sopenharmony_ci ... pass 9857db96d56Sopenharmony_ci ... elif 1: 9867db96d56Sopenharmony_ci ... pass 9877db96d56Sopenharmony_ci ... else: 9887db96d56Sopenharmony_ci ... x() = 1 9897db96d56Sopenharmony_ci Traceback (most recent call last): 9907db96d56Sopenharmony_ci SyntaxError: expected ':' 9917db96d56Sopenharmony_ci 9927db96d56Sopenharmony_ci >>> if 1: 9937db96d56Sopenharmony_ci ... pass 9947db96d56Sopenharmony_ci ... elif 1 9957db96d56Sopenharmony_ci ... pass 9967db96d56Sopenharmony_ci ... else: 9977db96d56Sopenharmony_ci ... x() = 1 9987db96d56Sopenharmony_ci Traceback (most recent call last): 9997db96d56Sopenharmony_ci SyntaxError: expected ':' 10007db96d56Sopenharmony_ci 10017db96d56Sopenharmony_ci >>> if 1: 10027db96d56Sopenharmony_ci ... pass 10037db96d56Sopenharmony_ci ... elif 1: 10047db96d56Sopenharmony_ci ... pass 10057db96d56Sopenharmony_ci ... else 10067db96d56Sopenharmony_ci ... x() = 1 10077db96d56Sopenharmony_ci Traceback (most recent call last): 10087db96d56Sopenharmony_ci SyntaxError: expected ':' 10097db96d56Sopenharmony_ci 10107db96d56Sopenharmony_ci >>> for x in range(10) 10117db96d56Sopenharmony_ci ... pass 10127db96d56Sopenharmony_ci Traceback (most recent call last): 10137db96d56Sopenharmony_ci SyntaxError: expected ':' 10147db96d56Sopenharmony_ci 10157db96d56Sopenharmony_ci >>> for x in range 10: 10167db96d56Sopenharmony_ci ... pass 10177db96d56Sopenharmony_ci Traceback (most recent call last): 10187db96d56Sopenharmony_ci SyntaxError: invalid syntax 10197db96d56Sopenharmony_ci 10207db96d56Sopenharmony_ci >>> while True 10217db96d56Sopenharmony_ci ... pass 10227db96d56Sopenharmony_ci Traceback (most recent call last): 10237db96d56Sopenharmony_ci SyntaxError: expected ':' 10247db96d56Sopenharmony_ci 10257db96d56Sopenharmony_ci >>> with blech as something 10267db96d56Sopenharmony_ci ... pass 10277db96d56Sopenharmony_ci Traceback (most recent call last): 10287db96d56Sopenharmony_ci SyntaxError: expected ':' 10297db96d56Sopenharmony_ci 10307db96d56Sopenharmony_ci >>> with blech 10317db96d56Sopenharmony_ci ... pass 10327db96d56Sopenharmony_ci Traceback (most recent call last): 10337db96d56Sopenharmony_ci SyntaxError: expected ':' 10347db96d56Sopenharmony_ci 10357db96d56Sopenharmony_ci >>> with blech, block as something 10367db96d56Sopenharmony_ci ... pass 10377db96d56Sopenharmony_ci Traceback (most recent call last): 10387db96d56Sopenharmony_ci SyntaxError: expected ':' 10397db96d56Sopenharmony_ci 10407db96d56Sopenharmony_ci >>> with blech, block as something, bluch 10417db96d56Sopenharmony_ci ... pass 10427db96d56Sopenharmony_ci Traceback (most recent call last): 10437db96d56Sopenharmony_ci SyntaxError: expected ':' 10447db96d56Sopenharmony_ci 10457db96d56Sopenharmony_ci >>> with (blech as something) 10467db96d56Sopenharmony_ci ... pass 10477db96d56Sopenharmony_ci Traceback (most recent call last): 10487db96d56Sopenharmony_ci SyntaxError: expected ':' 10497db96d56Sopenharmony_ci 10507db96d56Sopenharmony_ci >>> with (blech) 10517db96d56Sopenharmony_ci ... pass 10527db96d56Sopenharmony_ci Traceback (most recent call last): 10537db96d56Sopenharmony_ci SyntaxError: expected ':' 10547db96d56Sopenharmony_ci 10557db96d56Sopenharmony_ci >>> with (blech, block as something) 10567db96d56Sopenharmony_ci ... pass 10577db96d56Sopenharmony_ci Traceback (most recent call last): 10587db96d56Sopenharmony_ci SyntaxError: expected ':' 10597db96d56Sopenharmony_ci 10607db96d56Sopenharmony_ci >>> with (blech, block as something, bluch) 10617db96d56Sopenharmony_ci ... pass 10627db96d56Sopenharmony_ci Traceback (most recent call last): 10637db96d56Sopenharmony_ci SyntaxError: expected ':' 10647db96d56Sopenharmony_ci 10657db96d56Sopenharmony_ci >>> with block ad something: 10667db96d56Sopenharmony_ci ... pass 10677db96d56Sopenharmony_ci Traceback (most recent call last): 10687db96d56Sopenharmony_ci SyntaxError: invalid syntax 10697db96d56Sopenharmony_ci 10707db96d56Sopenharmony_ci >>> try 10717db96d56Sopenharmony_ci ... pass 10727db96d56Sopenharmony_ci Traceback (most recent call last): 10737db96d56Sopenharmony_ci SyntaxError: expected ':' 10747db96d56Sopenharmony_ci 10757db96d56Sopenharmony_ci >>> try: 10767db96d56Sopenharmony_ci ... pass 10777db96d56Sopenharmony_ci ... except 10787db96d56Sopenharmony_ci ... pass 10797db96d56Sopenharmony_ci Traceback (most recent call last): 10807db96d56Sopenharmony_ci SyntaxError: expected ':' 10817db96d56Sopenharmony_ci 10827db96d56Sopenharmony_ci >>> match x 10837db96d56Sopenharmony_ci ... case list(): 10847db96d56Sopenharmony_ci ... pass 10857db96d56Sopenharmony_ci Traceback (most recent call last): 10867db96d56Sopenharmony_ci SyntaxError: expected ':' 10877db96d56Sopenharmony_ci 10887db96d56Sopenharmony_ci >>> match x x: 10897db96d56Sopenharmony_ci ... case list(): 10907db96d56Sopenharmony_ci ... pass 10917db96d56Sopenharmony_ci Traceback (most recent call last): 10927db96d56Sopenharmony_ci SyntaxError: invalid syntax 10937db96d56Sopenharmony_ci 10947db96d56Sopenharmony_ci >>> match x: 10957db96d56Sopenharmony_ci ... case list() 10967db96d56Sopenharmony_ci ... pass 10977db96d56Sopenharmony_ci Traceback (most recent call last): 10987db96d56Sopenharmony_ci SyntaxError: expected ':' 10997db96d56Sopenharmony_ci 11007db96d56Sopenharmony_ci >>> match x: 11017db96d56Sopenharmony_ci ... case [y] if y > 0 11027db96d56Sopenharmony_ci ... pass 11037db96d56Sopenharmony_ci Traceback (most recent call last): 11047db96d56Sopenharmony_ci SyntaxError: expected ':' 11057db96d56Sopenharmony_ci 11067db96d56Sopenharmony_ci >>> if x = 3: 11077db96d56Sopenharmony_ci ... pass 11087db96d56Sopenharmony_ci Traceback (most recent call last): 11097db96d56Sopenharmony_ci SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='? 11107db96d56Sopenharmony_ci 11117db96d56Sopenharmony_ci >>> while x = 3: 11127db96d56Sopenharmony_ci ... pass 11137db96d56Sopenharmony_ci Traceback (most recent call last): 11147db96d56Sopenharmony_ci SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='? 11157db96d56Sopenharmony_ci 11167db96d56Sopenharmony_ci >>> if x.a = 3: 11177db96d56Sopenharmony_ci ... pass 11187db96d56Sopenharmony_ci Traceback (most recent call last): 11197db96d56Sopenharmony_ci SyntaxError: cannot assign to attribute here. Maybe you meant '==' instead of '='? 11207db96d56Sopenharmony_ci 11217db96d56Sopenharmony_ci >>> while x.a = 3: 11227db96d56Sopenharmony_ci ... pass 11237db96d56Sopenharmony_ci Traceback (most recent call last): 11247db96d56Sopenharmony_ci SyntaxError: cannot assign to attribute here. Maybe you meant '==' instead of '='? 11257db96d56Sopenharmony_ci 11267db96d56Sopenharmony_ci 11277db96d56Sopenharmony_ciMissing parens after function definition 11287db96d56Sopenharmony_ci 11297db96d56Sopenharmony_ci >>> def f: 11307db96d56Sopenharmony_ci Traceback (most recent call last): 11317db96d56Sopenharmony_ci SyntaxError: expected '(' 11327db96d56Sopenharmony_ci 11337db96d56Sopenharmony_ci >>> async def f: 11347db96d56Sopenharmony_ci Traceback (most recent call last): 11357db96d56Sopenharmony_ci SyntaxError: expected '(' 11367db96d56Sopenharmony_ci 11377db96d56Sopenharmony_ciParenthesized arguments in function definitions 11387db96d56Sopenharmony_ci 11397db96d56Sopenharmony_ci >>> def f(x, (y, z), w): 11407db96d56Sopenharmony_ci ... pass 11417db96d56Sopenharmony_ci Traceback (most recent call last): 11427db96d56Sopenharmony_ci SyntaxError: Function parameters cannot be parenthesized 11437db96d56Sopenharmony_ci 11447db96d56Sopenharmony_ci >>> def f((x, y, z, w)): 11457db96d56Sopenharmony_ci ... pass 11467db96d56Sopenharmony_ci Traceback (most recent call last): 11477db96d56Sopenharmony_ci SyntaxError: Function parameters cannot be parenthesized 11487db96d56Sopenharmony_ci 11497db96d56Sopenharmony_ci >>> def f(x, (y, z, w)): 11507db96d56Sopenharmony_ci ... pass 11517db96d56Sopenharmony_ci Traceback (most recent call last): 11527db96d56Sopenharmony_ci SyntaxError: Function parameters cannot be parenthesized 11537db96d56Sopenharmony_ci 11547db96d56Sopenharmony_ci >>> def f((x, y, z), w): 11557db96d56Sopenharmony_ci ... pass 11567db96d56Sopenharmony_ci Traceback (most recent call last): 11577db96d56Sopenharmony_ci SyntaxError: Function parameters cannot be parenthesized 11587db96d56Sopenharmony_ci 11597db96d56Sopenharmony_ci >>> lambda x, (y, z), w: None 11607db96d56Sopenharmony_ci Traceback (most recent call last): 11617db96d56Sopenharmony_ci SyntaxError: Lambda expression parameters cannot be parenthesized 11627db96d56Sopenharmony_ci 11637db96d56Sopenharmony_ci >>> lambda (x, y, z, w): None 11647db96d56Sopenharmony_ci Traceback (most recent call last): 11657db96d56Sopenharmony_ci SyntaxError: Lambda expression parameters cannot be parenthesized 11667db96d56Sopenharmony_ci 11677db96d56Sopenharmony_ci >>> lambda x, (y, z, w): None 11687db96d56Sopenharmony_ci Traceback (most recent call last): 11697db96d56Sopenharmony_ci SyntaxError: Lambda expression parameters cannot be parenthesized 11707db96d56Sopenharmony_ci 11717db96d56Sopenharmony_ci >>> lambda (x, y, z), w: None 11727db96d56Sopenharmony_ci Traceback (most recent call last): 11737db96d56Sopenharmony_ci SyntaxError: Lambda expression parameters cannot be parenthesized 11747db96d56Sopenharmony_ci 11757db96d56Sopenharmony_ciCustom error messages for try blocks that are not followed by except/finally 11767db96d56Sopenharmony_ci 11777db96d56Sopenharmony_ci >>> try: 11787db96d56Sopenharmony_ci ... x = 34 11797db96d56Sopenharmony_ci ... 11807db96d56Sopenharmony_ci Traceback (most recent call last): 11817db96d56Sopenharmony_ci SyntaxError: expected 'except' or 'finally' block 11827db96d56Sopenharmony_ci 11837db96d56Sopenharmony_ciCustom error message for try block mixing except and except* 11847db96d56Sopenharmony_ci 11857db96d56Sopenharmony_ci >>> try: 11867db96d56Sopenharmony_ci ... pass 11877db96d56Sopenharmony_ci ... except TypeError: 11887db96d56Sopenharmony_ci ... pass 11897db96d56Sopenharmony_ci ... except* ValueError: 11907db96d56Sopenharmony_ci ... pass 11917db96d56Sopenharmony_ci Traceback (most recent call last): 11927db96d56Sopenharmony_ci SyntaxError: cannot have both 'except' and 'except*' on the same 'try' 11937db96d56Sopenharmony_ci 11947db96d56Sopenharmony_ci >>> try: 11957db96d56Sopenharmony_ci ... pass 11967db96d56Sopenharmony_ci ... except* TypeError: 11977db96d56Sopenharmony_ci ... pass 11987db96d56Sopenharmony_ci ... except ValueError: 11997db96d56Sopenharmony_ci ... pass 12007db96d56Sopenharmony_ci Traceback (most recent call last): 12017db96d56Sopenharmony_ci SyntaxError: cannot have both 'except' and 'except*' on the same 'try' 12027db96d56Sopenharmony_ci 12037db96d56Sopenharmony_ci >>> try: 12047db96d56Sopenharmony_ci ... pass 12057db96d56Sopenharmony_ci ... except TypeError: 12067db96d56Sopenharmony_ci ... pass 12077db96d56Sopenharmony_ci ... except TypeError: 12087db96d56Sopenharmony_ci ... pass 12097db96d56Sopenharmony_ci ... except* ValueError: 12107db96d56Sopenharmony_ci ... pass 12117db96d56Sopenharmony_ci Traceback (most recent call last): 12127db96d56Sopenharmony_ci SyntaxError: cannot have both 'except' and 'except*' on the same 'try' 12137db96d56Sopenharmony_ci 12147db96d56Sopenharmony_ci >>> try: 12157db96d56Sopenharmony_ci ... pass 12167db96d56Sopenharmony_ci ... except* TypeError: 12177db96d56Sopenharmony_ci ... pass 12187db96d56Sopenharmony_ci ... except* TypeError: 12197db96d56Sopenharmony_ci ... pass 12207db96d56Sopenharmony_ci ... except ValueError: 12217db96d56Sopenharmony_ci ... pass 12227db96d56Sopenharmony_ci Traceback (most recent call last): 12237db96d56Sopenharmony_ci SyntaxError: cannot have both 'except' and 'except*' on the same 'try' 12247db96d56Sopenharmony_ci 12257db96d56Sopenharmony_ciEnsure that early = are not matched by the parser as invalid comparisons 12267db96d56Sopenharmony_ci >>> f(2, 4, x=34); 1 $ 2 12277db96d56Sopenharmony_ci Traceback (most recent call last): 12287db96d56Sopenharmony_ci SyntaxError: invalid syntax 12297db96d56Sopenharmony_ci 12307db96d56Sopenharmony_ci >>> dict(x=34); x $ y 12317db96d56Sopenharmony_ci Traceback (most recent call last): 12327db96d56Sopenharmony_ci SyntaxError: invalid syntax 12337db96d56Sopenharmony_ci 12347db96d56Sopenharmony_ci >>> dict(x=34, (x for x in range 10), 1); x $ y 12357db96d56Sopenharmony_ci Traceback (most recent call last): 12367db96d56Sopenharmony_ci SyntaxError: invalid syntax 12377db96d56Sopenharmony_ci 12387db96d56Sopenharmony_ci >>> dict(x=34, x=1, y=2); x $ y 12397db96d56Sopenharmony_ci Traceback (most recent call last): 12407db96d56Sopenharmony_ci SyntaxError: invalid syntax 12417db96d56Sopenharmony_ci 12427db96d56Sopenharmony_ciIncomplete dictionary literals 12437db96d56Sopenharmony_ci 12447db96d56Sopenharmony_ci >>> {1:2, 3:4, 5} 12457db96d56Sopenharmony_ci Traceback (most recent call last): 12467db96d56Sopenharmony_ci SyntaxError: ':' expected after dictionary key 12477db96d56Sopenharmony_ci 12487db96d56Sopenharmony_ci >>> {1:2, 3:4, 5:} 12497db96d56Sopenharmony_ci Traceback (most recent call last): 12507db96d56Sopenharmony_ci SyntaxError: expression expected after dictionary key and ':' 12517db96d56Sopenharmony_ci 12527db96d56Sopenharmony_ci >>> {1: *12+1, 23: 1} 12537db96d56Sopenharmony_ci Traceback (most recent call last): 12547db96d56Sopenharmony_ci SyntaxError: cannot use a starred expression in a dictionary value 12557db96d56Sopenharmony_ci 12567db96d56Sopenharmony_ci >>> {1: *12+1} 12577db96d56Sopenharmony_ci Traceback (most recent call last): 12587db96d56Sopenharmony_ci SyntaxError: cannot use a starred expression in a dictionary value 12597db96d56Sopenharmony_ci 12607db96d56Sopenharmony_ci >>> {1: 23, 1: *12+1} 12617db96d56Sopenharmony_ci Traceback (most recent call last): 12627db96d56Sopenharmony_ci SyntaxError: cannot use a starred expression in a dictionary value 12637db96d56Sopenharmony_ci 12647db96d56Sopenharmony_ci >>> {1:} 12657db96d56Sopenharmony_ci Traceback (most recent call last): 12667db96d56Sopenharmony_ci SyntaxError: expression expected after dictionary key and ':' 12677db96d56Sopenharmony_ci 12687db96d56Sopenharmony_ci # Ensure that the error is not raised for syntax errors that happen after sets 12697db96d56Sopenharmony_ci 12707db96d56Sopenharmony_ci >>> {1} $ 12717db96d56Sopenharmony_ci Traceback (most recent call last): 12727db96d56Sopenharmony_ci SyntaxError: invalid syntax 12737db96d56Sopenharmony_ci 12747db96d56Sopenharmony_ci # Ensure that the error is not raised for invalid expressions 12757db96d56Sopenharmony_ci 12767db96d56Sopenharmony_ci >>> {1: 2, 3: foo(,), 4: 5} 12777db96d56Sopenharmony_ci Traceback (most recent call last): 12787db96d56Sopenharmony_ci SyntaxError: invalid syntax 12797db96d56Sopenharmony_ci 12807db96d56Sopenharmony_ci >>> {1: $, 2: 3} 12817db96d56Sopenharmony_ci Traceback (most recent call last): 12827db96d56Sopenharmony_ci SyntaxError: invalid syntax 12837db96d56Sopenharmony_ci 12847db96d56Sopenharmony_ciSpecialized indentation errors: 12857db96d56Sopenharmony_ci 12867db96d56Sopenharmony_ci >>> while condition: 12877db96d56Sopenharmony_ci ... pass 12887db96d56Sopenharmony_ci Traceback (most recent call last): 12897db96d56Sopenharmony_ci IndentationError: expected an indented block after 'while' statement on line 1 12907db96d56Sopenharmony_ci 12917db96d56Sopenharmony_ci >>> for x in range(10): 12927db96d56Sopenharmony_ci ... pass 12937db96d56Sopenharmony_ci Traceback (most recent call last): 12947db96d56Sopenharmony_ci IndentationError: expected an indented block after 'for' statement on line 1 12957db96d56Sopenharmony_ci 12967db96d56Sopenharmony_ci >>> for x in range(10): 12977db96d56Sopenharmony_ci ... pass 12987db96d56Sopenharmony_ci ... else: 12997db96d56Sopenharmony_ci ... pass 13007db96d56Sopenharmony_ci Traceback (most recent call last): 13017db96d56Sopenharmony_ci IndentationError: expected an indented block after 'else' statement on line 3 13027db96d56Sopenharmony_ci 13037db96d56Sopenharmony_ci >>> async for x in range(10): 13047db96d56Sopenharmony_ci ... pass 13057db96d56Sopenharmony_ci Traceback (most recent call last): 13067db96d56Sopenharmony_ci IndentationError: expected an indented block after 'for' statement on line 1 13077db96d56Sopenharmony_ci 13087db96d56Sopenharmony_ci >>> async for x in range(10): 13097db96d56Sopenharmony_ci ... pass 13107db96d56Sopenharmony_ci ... else: 13117db96d56Sopenharmony_ci ... pass 13127db96d56Sopenharmony_ci Traceback (most recent call last): 13137db96d56Sopenharmony_ci IndentationError: expected an indented block after 'else' statement on line 3 13147db96d56Sopenharmony_ci 13157db96d56Sopenharmony_ci >>> if something: 13167db96d56Sopenharmony_ci ... pass 13177db96d56Sopenharmony_ci Traceback (most recent call last): 13187db96d56Sopenharmony_ci IndentationError: expected an indented block after 'if' statement on line 1 13197db96d56Sopenharmony_ci 13207db96d56Sopenharmony_ci >>> if something: 13217db96d56Sopenharmony_ci ... pass 13227db96d56Sopenharmony_ci ... elif something_else: 13237db96d56Sopenharmony_ci ... pass 13247db96d56Sopenharmony_ci Traceback (most recent call last): 13257db96d56Sopenharmony_ci IndentationError: expected an indented block after 'elif' statement on line 3 13267db96d56Sopenharmony_ci 13277db96d56Sopenharmony_ci >>> if something: 13287db96d56Sopenharmony_ci ... pass 13297db96d56Sopenharmony_ci ... elif something_else: 13307db96d56Sopenharmony_ci ... pass 13317db96d56Sopenharmony_ci ... else: 13327db96d56Sopenharmony_ci ... pass 13337db96d56Sopenharmony_ci Traceback (most recent call last): 13347db96d56Sopenharmony_ci IndentationError: expected an indented block after 'else' statement on line 5 13357db96d56Sopenharmony_ci 13367db96d56Sopenharmony_ci >>> try: 13377db96d56Sopenharmony_ci ... pass 13387db96d56Sopenharmony_ci Traceback (most recent call last): 13397db96d56Sopenharmony_ci IndentationError: expected an indented block after 'try' statement on line 1 13407db96d56Sopenharmony_ci 13417db96d56Sopenharmony_ci >>> try: 13427db96d56Sopenharmony_ci ... something() 13437db96d56Sopenharmony_ci ... except: 13447db96d56Sopenharmony_ci ... pass 13457db96d56Sopenharmony_ci Traceback (most recent call last): 13467db96d56Sopenharmony_ci IndentationError: expected an indented block after 'except' statement on line 3 13477db96d56Sopenharmony_ci 13487db96d56Sopenharmony_ci >>> try: 13497db96d56Sopenharmony_ci ... something() 13507db96d56Sopenharmony_ci ... except A: 13517db96d56Sopenharmony_ci ... pass 13527db96d56Sopenharmony_ci Traceback (most recent call last): 13537db96d56Sopenharmony_ci IndentationError: expected an indented block after 'except' statement on line 3 13547db96d56Sopenharmony_ci 13557db96d56Sopenharmony_ci >>> try: 13567db96d56Sopenharmony_ci ... something() 13577db96d56Sopenharmony_ci ... except* A: 13587db96d56Sopenharmony_ci ... pass 13597db96d56Sopenharmony_ci Traceback (most recent call last): 13607db96d56Sopenharmony_ci IndentationError: expected an indented block after 'except*' statement on line 3 13617db96d56Sopenharmony_ci 13627db96d56Sopenharmony_ci >>> try: 13637db96d56Sopenharmony_ci ... something() 13647db96d56Sopenharmony_ci ... except A: 13657db96d56Sopenharmony_ci ... pass 13667db96d56Sopenharmony_ci ... finally: 13677db96d56Sopenharmony_ci ... pass 13687db96d56Sopenharmony_ci Traceback (most recent call last): 13697db96d56Sopenharmony_ci IndentationError: expected an indented block after 'finally' statement on line 5 13707db96d56Sopenharmony_ci 13717db96d56Sopenharmony_ci >>> try: 13727db96d56Sopenharmony_ci ... something() 13737db96d56Sopenharmony_ci ... except* A: 13747db96d56Sopenharmony_ci ... pass 13757db96d56Sopenharmony_ci ... finally: 13767db96d56Sopenharmony_ci ... pass 13777db96d56Sopenharmony_ci Traceback (most recent call last): 13787db96d56Sopenharmony_ci IndentationError: expected an indented block after 'finally' statement on line 5 13797db96d56Sopenharmony_ci 13807db96d56Sopenharmony_ci >>> with A: 13817db96d56Sopenharmony_ci ... pass 13827db96d56Sopenharmony_ci Traceback (most recent call last): 13837db96d56Sopenharmony_ci IndentationError: expected an indented block after 'with' statement on line 1 13847db96d56Sopenharmony_ci 13857db96d56Sopenharmony_ci >>> with A as a, B as b: 13867db96d56Sopenharmony_ci ... pass 13877db96d56Sopenharmony_ci Traceback (most recent call last): 13887db96d56Sopenharmony_ci IndentationError: expected an indented block after 'with' statement on line 1 13897db96d56Sopenharmony_ci 13907db96d56Sopenharmony_ci >>> with (A as a, B as b): 13917db96d56Sopenharmony_ci ... pass 13927db96d56Sopenharmony_ci Traceback (most recent call last): 13937db96d56Sopenharmony_ci IndentationError: expected an indented block after 'with' statement on line 1 13947db96d56Sopenharmony_ci 13957db96d56Sopenharmony_ci >>> async with A: 13967db96d56Sopenharmony_ci ... pass 13977db96d56Sopenharmony_ci Traceback (most recent call last): 13987db96d56Sopenharmony_ci IndentationError: expected an indented block after 'with' statement on line 1 13997db96d56Sopenharmony_ci 14007db96d56Sopenharmony_ci >>> async with A as a, B as b: 14017db96d56Sopenharmony_ci ... pass 14027db96d56Sopenharmony_ci Traceback (most recent call last): 14037db96d56Sopenharmony_ci IndentationError: expected an indented block after 'with' statement on line 1 14047db96d56Sopenharmony_ci 14057db96d56Sopenharmony_ci >>> async with (A as a, B as b): 14067db96d56Sopenharmony_ci ... pass 14077db96d56Sopenharmony_ci Traceback (most recent call last): 14087db96d56Sopenharmony_ci IndentationError: expected an indented block after 'with' statement on line 1 14097db96d56Sopenharmony_ci 14107db96d56Sopenharmony_ci >>> def foo(x, /, y, *, z=2): 14117db96d56Sopenharmony_ci ... pass 14127db96d56Sopenharmony_ci Traceback (most recent call last): 14137db96d56Sopenharmony_ci IndentationError: expected an indented block after function definition on line 1 14147db96d56Sopenharmony_ci 14157db96d56Sopenharmony_ci >>> class Blech(A): 14167db96d56Sopenharmony_ci ... pass 14177db96d56Sopenharmony_ci Traceback (most recent call last): 14187db96d56Sopenharmony_ci IndentationError: expected an indented block after class definition on line 1 14197db96d56Sopenharmony_ci 14207db96d56Sopenharmony_ci >>> match something: 14217db96d56Sopenharmony_ci ... pass 14227db96d56Sopenharmony_ci Traceback (most recent call last): 14237db96d56Sopenharmony_ci IndentationError: expected an indented block after 'match' statement on line 1 14247db96d56Sopenharmony_ci 14257db96d56Sopenharmony_ci >>> match something: 14267db96d56Sopenharmony_ci ... case []: 14277db96d56Sopenharmony_ci ... pass 14287db96d56Sopenharmony_ci Traceback (most recent call last): 14297db96d56Sopenharmony_ci IndentationError: expected an indented block after 'case' statement on line 2 14307db96d56Sopenharmony_ci 14317db96d56Sopenharmony_ci >>> match something: 14327db96d56Sopenharmony_ci ... case []: 14337db96d56Sopenharmony_ci ... ... 14347db96d56Sopenharmony_ci ... case {}: 14357db96d56Sopenharmony_ci ... pass 14367db96d56Sopenharmony_ci Traceback (most recent call last): 14377db96d56Sopenharmony_ci IndentationError: expected an indented block after 'case' statement on line 4 14387db96d56Sopenharmony_ci 14397db96d56Sopenharmony_ciMake sure that the old "raise X, Y[, Z]" form is gone: 14407db96d56Sopenharmony_ci >>> raise X, Y 14417db96d56Sopenharmony_ci Traceback (most recent call last): 14427db96d56Sopenharmony_ci ... 14437db96d56Sopenharmony_ci SyntaxError: invalid syntax 14447db96d56Sopenharmony_ci >>> raise X, Y, Z 14457db96d56Sopenharmony_ci Traceback (most recent call last): 14467db96d56Sopenharmony_ci ... 14477db96d56Sopenharmony_ci SyntaxError: invalid syntax 14487db96d56Sopenharmony_ci 14497db96d56Sopenharmony_ciCheck that an multiple exception types with missing parentheses 14507db96d56Sopenharmony_ciraise a custom exception 14517db96d56Sopenharmony_ci 14527db96d56Sopenharmony_ci >>> try: 14537db96d56Sopenharmony_ci ... pass 14547db96d56Sopenharmony_ci ... except A, B: 14557db96d56Sopenharmony_ci ... pass 14567db96d56Sopenharmony_ci Traceback (most recent call last): 14577db96d56Sopenharmony_ci SyntaxError: multiple exception types must be parenthesized 14587db96d56Sopenharmony_ci 14597db96d56Sopenharmony_ci >>> try: 14607db96d56Sopenharmony_ci ... pass 14617db96d56Sopenharmony_ci ... except A, B, C: 14627db96d56Sopenharmony_ci ... pass 14637db96d56Sopenharmony_ci Traceback (most recent call last): 14647db96d56Sopenharmony_ci SyntaxError: multiple exception types must be parenthesized 14657db96d56Sopenharmony_ci 14667db96d56Sopenharmony_ci >>> try: 14677db96d56Sopenharmony_ci ... pass 14687db96d56Sopenharmony_ci ... except A, B, C as blech: 14697db96d56Sopenharmony_ci ... pass 14707db96d56Sopenharmony_ci Traceback (most recent call last): 14717db96d56Sopenharmony_ci SyntaxError: multiple exception types must be parenthesized 14727db96d56Sopenharmony_ci 14737db96d56Sopenharmony_ci >>> try: 14747db96d56Sopenharmony_ci ... pass 14757db96d56Sopenharmony_ci ... except A, B, C as blech: 14767db96d56Sopenharmony_ci ... pass 14777db96d56Sopenharmony_ci ... finally: 14787db96d56Sopenharmony_ci ... pass 14797db96d56Sopenharmony_ci Traceback (most recent call last): 14807db96d56Sopenharmony_ci SyntaxError: multiple exception types must be parenthesized 14817db96d56Sopenharmony_ci 14827db96d56Sopenharmony_ci 14837db96d56Sopenharmony_ci >>> try: 14847db96d56Sopenharmony_ci ... pass 14857db96d56Sopenharmony_ci ... except* A, B: 14867db96d56Sopenharmony_ci ... pass 14877db96d56Sopenharmony_ci Traceback (most recent call last): 14887db96d56Sopenharmony_ci SyntaxError: multiple exception types must be parenthesized 14897db96d56Sopenharmony_ci 14907db96d56Sopenharmony_ci >>> try: 14917db96d56Sopenharmony_ci ... pass 14927db96d56Sopenharmony_ci ... except* A, B, C: 14937db96d56Sopenharmony_ci ... pass 14947db96d56Sopenharmony_ci Traceback (most recent call last): 14957db96d56Sopenharmony_ci SyntaxError: multiple exception types must be parenthesized 14967db96d56Sopenharmony_ci 14977db96d56Sopenharmony_ci >>> try: 14987db96d56Sopenharmony_ci ... pass 14997db96d56Sopenharmony_ci ... except* A, B, C as blech: 15007db96d56Sopenharmony_ci ... pass 15017db96d56Sopenharmony_ci Traceback (most recent call last): 15027db96d56Sopenharmony_ci SyntaxError: multiple exception types must be parenthesized 15037db96d56Sopenharmony_ci 15047db96d56Sopenharmony_ci >>> try: 15057db96d56Sopenharmony_ci ... pass 15067db96d56Sopenharmony_ci ... except* A, B, C as blech: 15077db96d56Sopenharmony_ci ... pass 15087db96d56Sopenharmony_ci ... finally: 15097db96d56Sopenharmony_ci ... pass 15107db96d56Sopenharmony_ci Traceback (most recent call last): 15117db96d56Sopenharmony_ci SyntaxError: multiple exception types must be parenthesized 15127db96d56Sopenharmony_ci 15137db96d56Sopenharmony_ciCustom exception for 'except*' without an exception type 15147db96d56Sopenharmony_ci 15157db96d56Sopenharmony_ci >>> try: 15167db96d56Sopenharmony_ci ... pass 15177db96d56Sopenharmony_ci ... except* A as a: 15187db96d56Sopenharmony_ci ... pass 15197db96d56Sopenharmony_ci ... except*: 15207db96d56Sopenharmony_ci ... pass 15217db96d56Sopenharmony_ci Traceback (most recent call last): 15227db96d56Sopenharmony_ci SyntaxError: expected one or more exception types 15237db96d56Sopenharmony_ci 15247db96d56Sopenharmony_ci 15257db96d56Sopenharmony_ci>>> f(a=23, a=234) 15267db96d56Sopenharmony_ciTraceback (most recent call last): 15277db96d56Sopenharmony_ci ... 15287db96d56Sopenharmony_ciSyntaxError: keyword argument repeated: a 15297db96d56Sopenharmony_ci 15307db96d56Sopenharmony_ci>>> {1, 2, 3} = 42 15317db96d56Sopenharmony_ciTraceback (most recent call last): 15327db96d56Sopenharmony_ciSyntaxError: cannot assign to set display here. Maybe you meant '==' instead of '='? 15337db96d56Sopenharmony_ci 15347db96d56Sopenharmony_ci>>> {1: 2, 3: 4} = 42 15357db96d56Sopenharmony_ciTraceback (most recent call last): 15367db96d56Sopenharmony_ciSyntaxError: cannot assign to dict literal here. Maybe you meant '==' instead of '='? 15377db96d56Sopenharmony_ci 15387db96d56Sopenharmony_ci>>> f'{x}' = 42 15397db96d56Sopenharmony_ciTraceback (most recent call last): 15407db96d56Sopenharmony_ciSyntaxError: cannot assign to f-string expression here. Maybe you meant '==' instead of '='? 15417db96d56Sopenharmony_ci 15427db96d56Sopenharmony_ci>>> f'{x}-{y}' = 42 15437db96d56Sopenharmony_ciTraceback (most recent call last): 15447db96d56Sopenharmony_ciSyntaxError: cannot assign to f-string expression here. Maybe you meant '==' instead of '='? 15457db96d56Sopenharmony_ci 15467db96d56Sopenharmony_ci>>> (x, y, z=3, d, e) 15477db96d56Sopenharmony_ciTraceback (most recent call last): 15487db96d56Sopenharmony_ciSyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='? 15497db96d56Sopenharmony_ci 15507db96d56Sopenharmony_ci>>> [x, y, z=3, d, e] 15517db96d56Sopenharmony_ciTraceback (most recent call last): 15527db96d56Sopenharmony_ciSyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='? 15537db96d56Sopenharmony_ci 15547db96d56Sopenharmony_ci>>> [z=3] 15557db96d56Sopenharmony_ciTraceback (most recent call last): 15567db96d56Sopenharmony_ciSyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='? 15577db96d56Sopenharmony_ci 15587db96d56Sopenharmony_ci>>> {x, y, z=3, d, e} 15597db96d56Sopenharmony_ciTraceback (most recent call last): 15607db96d56Sopenharmony_ciSyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='? 15617db96d56Sopenharmony_ci 15627db96d56Sopenharmony_ci>>> {z=3} 15637db96d56Sopenharmony_ciTraceback (most recent call last): 15647db96d56Sopenharmony_ciSyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='? 15657db96d56Sopenharmony_ci 15667db96d56Sopenharmony_ci>>> from t import x, 15677db96d56Sopenharmony_ciTraceback (most recent call last): 15687db96d56Sopenharmony_ciSyntaxError: trailing comma not allowed without surrounding parentheses 15697db96d56Sopenharmony_ci 15707db96d56Sopenharmony_ci>>> from t import x,y, 15717db96d56Sopenharmony_ciTraceback (most recent call last): 15727db96d56Sopenharmony_ciSyntaxError: trailing comma not allowed without surrounding parentheses 15737db96d56Sopenharmony_ci 15747db96d56Sopenharmony_ci# Check that we dont raise the "trailing comma" error if there is more 15757db96d56Sopenharmony_ci# input to the left of the valid part that we parsed. 15767db96d56Sopenharmony_ci 15777db96d56Sopenharmony_ci>>> from t import x,y, and 3 15787db96d56Sopenharmony_ciTraceback (most recent call last): 15797db96d56Sopenharmony_ciSyntaxError: invalid syntax 15807db96d56Sopenharmony_ci 15817db96d56Sopenharmony_ci>>> (): int 15827db96d56Sopenharmony_ciTraceback (most recent call last): 15837db96d56Sopenharmony_ciSyntaxError: only single target (not tuple) can be annotated 15847db96d56Sopenharmony_ci>>> []: int 15857db96d56Sopenharmony_ciTraceback (most recent call last): 15867db96d56Sopenharmony_ciSyntaxError: only single target (not list) can be annotated 15877db96d56Sopenharmony_ci>>> (()): int 15887db96d56Sopenharmony_ciTraceback (most recent call last): 15897db96d56Sopenharmony_ciSyntaxError: only single target (not tuple) can be annotated 15907db96d56Sopenharmony_ci>>> ([]): int 15917db96d56Sopenharmony_ciTraceback (most recent call last): 15927db96d56Sopenharmony_ciSyntaxError: only single target (not list) can be annotated 15937db96d56Sopenharmony_ci 15947db96d56Sopenharmony_ciCorner-cases that used to fail to raise the correct error: 15957db96d56Sopenharmony_ci 15967db96d56Sopenharmony_ci >>> def f(*, x=lambda __debug__:0): pass 15977db96d56Sopenharmony_ci Traceback (most recent call last): 15987db96d56Sopenharmony_ci SyntaxError: cannot assign to __debug__ 15997db96d56Sopenharmony_ci 16007db96d56Sopenharmony_ci >>> def f(*args:(lambda __debug__:0)): pass 16017db96d56Sopenharmony_ci Traceback (most recent call last): 16027db96d56Sopenharmony_ci SyntaxError: cannot assign to __debug__ 16037db96d56Sopenharmony_ci 16047db96d56Sopenharmony_ci >>> def f(**kwargs:(lambda __debug__:0)): pass 16057db96d56Sopenharmony_ci Traceback (most recent call last): 16067db96d56Sopenharmony_ci SyntaxError: cannot assign to __debug__ 16077db96d56Sopenharmony_ci 16087db96d56Sopenharmony_ci >>> with (lambda *:0): pass 16097db96d56Sopenharmony_ci Traceback (most recent call last): 16107db96d56Sopenharmony_ci SyntaxError: named arguments must follow bare * 16117db96d56Sopenharmony_ci 16127db96d56Sopenharmony_ciCorner-cases that used to crash: 16137db96d56Sopenharmony_ci 16147db96d56Sopenharmony_ci >>> def f(**__debug__): pass 16157db96d56Sopenharmony_ci Traceback (most recent call last): 16167db96d56Sopenharmony_ci SyntaxError: cannot assign to __debug__ 16177db96d56Sopenharmony_ci 16187db96d56Sopenharmony_ci >>> def f(*xx, __debug__): pass 16197db96d56Sopenharmony_ci Traceback (most recent call last): 16207db96d56Sopenharmony_ci SyntaxError: cannot assign to __debug__ 16217db96d56Sopenharmony_ci 16227db96d56Sopenharmony_ci >>> import ä £ 16237db96d56Sopenharmony_ci Traceback (most recent call last): 16247db96d56Sopenharmony_ci SyntaxError: invalid character '£' (U+00A3) 16257db96d56Sopenharmony_ci 16267db96d56Sopenharmony_ci Invalid pattern matching constructs: 16277db96d56Sopenharmony_ci 16287db96d56Sopenharmony_ci >>> match ...: 16297db96d56Sopenharmony_ci ... case 42 as _: 16307db96d56Sopenharmony_ci ... ... 16317db96d56Sopenharmony_ci Traceback (most recent call last): 16327db96d56Sopenharmony_ci SyntaxError: cannot use '_' as a target 16337db96d56Sopenharmony_ci 16347db96d56Sopenharmony_ci >>> match ...: 16357db96d56Sopenharmony_ci ... case 42 as 1+2+4: 16367db96d56Sopenharmony_ci ... ... 16377db96d56Sopenharmony_ci Traceback (most recent call last): 16387db96d56Sopenharmony_ci SyntaxError: invalid pattern target 16397db96d56Sopenharmony_ci 16407db96d56Sopenharmony_ci >>> match ...: 16417db96d56Sopenharmony_ci ... case Foo(z=1, y=2, x): 16427db96d56Sopenharmony_ci ... ... 16437db96d56Sopenharmony_ci Traceback (most recent call last): 16447db96d56Sopenharmony_ci SyntaxError: positional patterns follow keyword patterns 16457db96d56Sopenharmony_ci 16467db96d56Sopenharmony_ci >>> match ...: 16477db96d56Sopenharmony_ci ... case Foo(a, z=1, y=2, x): 16487db96d56Sopenharmony_ci ... ... 16497db96d56Sopenharmony_ci Traceback (most recent call last): 16507db96d56Sopenharmony_ci SyntaxError: positional patterns follow keyword patterns 16517db96d56Sopenharmony_ci 16527db96d56Sopenharmony_ci >>> match ...: 16537db96d56Sopenharmony_ci ... case Foo(z=1, x, y=2): 16547db96d56Sopenharmony_ci ... ... 16557db96d56Sopenharmony_ci Traceback (most recent call last): 16567db96d56Sopenharmony_ci SyntaxError: positional patterns follow keyword patterns 16577db96d56Sopenharmony_ci 16587db96d56Sopenharmony_ci >>> match ...: 16597db96d56Sopenharmony_ci ... case C(a=b, c, d=e, f, g=h, i, j=k, ...): 16607db96d56Sopenharmony_ci ... ... 16617db96d56Sopenharmony_ci Traceback (most recent call last): 16627db96d56Sopenharmony_ci SyntaxError: positional patterns follow keyword patterns 16637db96d56Sopenharmony_ci 16647db96d56Sopenharmony_ciUses of the star operator which should fail: 16657db96d56Sopenharmony_ci 16667db96d56Sopenharmony_ciA[:*b] 16677db96d56Sopenharmony_ci 16687db96d56Sopenharmony_ci >>> A[:*b] 16697db96d56Sopenharmony_ci Traceback (most recent call last): 16707db96d56Sopenharmony_ci ... 16717db96d56Sopenharmony_ci SyntaxError: invalid syntax 16727db96d56Sopenharmony_ci >>> A[:(*b)] 16737db96d56Sopenharmony_ci Traceback (most recent call last): 16747db96d56Sopenharmony_ci ... 16757db96d56Sopenharmony_ci SyntaxError: cannot use starred expression here 16767db96d56Sopenharmony_ci >>> A[:*b] = 1 16777db96d56Sopenharmony_ci Traceback (most recent call last): 16787db96d56Sopenharmony_ci ... 16797db96d56Sopenharmony_ci SyntaxError: invalid syntax 16807db96d56Sopenharmony_ci >>> del A[:*b] 16817db96d56Sopenharmony_ci Traceback (most recent call last): 16827db96d56Sopenharmony_ci ... 16837db96d56Sopenharmony_ci SyntaxError: invalid syntax 16847db96d56Sopenharmony_ci 16857db96d56Sopenharmony_ciA[*b:] 16867db96d56Sopenharmony_ci 16877db96d56Sopenharmony_ci >>> A[*b:] 16887db96d56Sopenharmony_ci Traceback (most recent call last): 16897db96d56Sopenharmony_ci ... 16907db96d56Sopenharmony_ci SyntaxError: invalid syntax 16917db96d56Sopenharmony_ci >>> A[(*b):] 16927db96d56Sopenharmony_ci Traceback (most recent call last): 16937db96d56Sopenharmony_ci ... 16947db96d56Sopenharmony_ci SyntaxError: cannot use starred expression here 16957db96d56Sopenharmony_ci >>> A[*b:] = 1 16967db96d56Sopenharmony_ci Traceback (most recent call last): 16977db96d56Sopenharmony_ci ... 16987db96d56Sopenharmony_ci SyntaxError: invalid syntax 16997db96d56Sopenharmony_ci >>> del A[*b:] 17007db96d56Sopenharmony_ci Traceback (most recent call last): 17017db96d56Sopenharmony_ci ... 17027db96d56Sopenharmony_ci SyntaxError: invalid syntax 17037db96d56Sopenharmony_ci 17047db96d56Sopenharmony_ciA[*b:*b] 17057db96d56Sopenharmony_ci 17067db96d56Sopenharmony_ci >>> A[*b:*b] 17077db96d56Sopenharmony_ci Traceback (most recent call last): 17087db96d56Sopenharmony_ci ... 17097db96d56Sopenharmony_ci SyntaxError: invalid syntax 17107db96d56Sopenharmony_ci >>> A[(*b:*b)] 17117db96d56Sopenharmony_ci Traceback (most recent call last): 17127db96d56Sopenharmony_ci ... 17137db96d56Sopenharmony_ci SyntaxError: invalid syntax 17147db96d56Sopenharmony_ci >>> A[*b:*b] = 1 17157db96d56Sopenharmony_ci Traceback (most recent call last): 17167db96d56Sopenharmony_ci ... 17177db96d56Sopenharmony_ci SyntaxError: invalid syntax 17187db96d56Sopenharmony_ci >>> del A[*b:*b] 17197db96d56Sopenharmony_ci Traceback (most recent call last): 17207db96d56Sopenharmony_ci ... 17217db96d56Sopenharmony_ci SyntaxError: invalid syntax 17227db96d56Sopenharmony_ci 17237db96d56Sopenharmony_ciA[*(1:2)] 17247db96d56Sopenharmony_ci 17257db96d56Sopenharmony_ci >>> A[*(1:2)] 17267db96d56Sopenharmony_ci Traceback (most recent call last): 17277db96d56Sopenharmony_ci ... 17287db96d56Sopenharmony_ci SyntaxError: invalid syntax 17297db96d56Sopenharmony_ci >>> A[*(1:2)] = 1 17307db96d56Sopenharmony_ci Traceback (most recent call last): 17317db96d56Sopenharmony_ci ... 17327db96d56Sopenharmony_ci SyntaxError: invalid syntax 17337db96d56Sopenharmony_ci >>> del A[*(1:2)] 17347db96d56Sopenharmony_ci Traceback (most recent call last): 17357db96d56Sopenharmony_ci ... 17367db96d56Sopenharmony_ci SyntaxError: invalid syntax 17377db96d56Sopenharmony_ci 17387db96d56Sopenharmony_ciA[*:] and A[:*] 17397db96d56Sopenharmony_ci 17407db96d56Sopenharmony_ci >>> A[*:] 17417db96d56Sopenharmony_ci Traceback (most recent call last): 17427db96d56Sopenharmony_ci ... 17437db96d56Sopenharmony_ci SyntaxError: invalid syntax 17447db96d56Sopenharmony_ci >>> A[:*] 17457db96d56Sopenharmony_ci Traceback (most recent call last): 17467db96d56Sopenharmony_ci ... 17477db96d56Sopenharmony_ci SyntaxError: invalid syntax 17487db96d56Sopenharmony_ci 17497db96d56Sopenharmony_ciA[*] 17507db96d56Sopenharmony_ci 17517db96d56Sopenharmony_ci >>> A[*] 17527db96d56Sopenharmony_ci Traceback (most recent call last): 17537db96d56Sopenharmony_ci ... 17547db96d56Sopenharmony_ci SyntaxError: invalid syntax 17557db96d56Sopenharmony_ci 17567db96d56Sopenharmony_ciA[**] 17577db96d56Sopenharmony_ci 17587db96d56Sopenharmony_ci >>> A[**] 17597db96d56Sopenharmony_ci Traceback (most recent call last): 17607db96d56Sopenharmony_ci ... 17617db96d56Sopenharmony_ci SyntaxError: invalid syntax 17627db96d56Sopenharmony_ci 17637db96d56Sopenharmony_ciA[**b] 17647db96d56Sopenharmony_ci 17657db96d56Sopenharmony_ci >>> A[**b] 17667db96d56Sopenharmony_ci Traceback (most recent call last): 17677db96d56Sopenharmony_ci ... 17687db96d56Sopenharmony_ci SyntaxError: invalid syntax 17697db96d56Sopenharmony_ci >>> A[**b] = 1 17707db96d56Sopenharmony_ci Traceback (most recent call last): 17717db96d56Sopenharmony_ci ... 17727db96d56Sopenharmony_ci SyntaxError: invalid syntax 17737db96d56Sopenharmony_ci >>> del A[**b] 17747db96d56Sopenharmony_ci Traceback (most recent call last): 17757db96d56Sopenharmony_ci ... 17767db96d56Sopenharmony_ci SyntaxError: invalid syntax 17777db96d56Sopenharmony_ci 17787db96d56Sopenharmony_cidef f(x: *b) 17797db96d56Sopenharmony_ci 17807db96d56Sopenharmony_ci >>> def f6(x: *b): pass 17817db96d56Sopenharmony_ci Traceback (most recent call last): 17827db96d56Sopenharmony_ci ... 17837db96d56Sopenharmony_ci SyntaxError: invalid syntax 17847db96d56Sopenharmony_ci >>> def f7(x: *b = 1): pass 17857db96d56Sopenharmony_ci Traceback (most recent call last): 17867db96d56Sopenharmony_ci ... 17877db96d56Sopenharmony_ci SyntaxError: invalid syntax 17887db96d56Sopenharmony_ci 17897db96d56Sopenharmony_ci**kwargs: *a 17907db96d56Sopenharmony_ci 17917db96d56Sopenharmony_ci >>> def f8(**kwargs: *a): pass 17927db96d56Sopenharmony_ci Traceback (most recent call last): 17937db96d56Sopenharmony_ci ... 17947db96d56Sopenharmony_ci SyntaxError: invalid syntax 17957db96d56Sopenharmony_ci 17967db96d56Sopenharmony_cix: *b 17977db96d56Sopenharmony_ci 17987db96d56Sopenharmony_ci >>> x: *b 17997db96d56Sopenharmony_ci Traceback (most recent call last): 18007db96d56Sopenharmony_ci ... 18017db96d56Sopenharmony_ci SyntaxError: invalid syntax 18027db96d56Sopenharmony_ci >>> x: *b = 1 18037db96d56Sopenharmony_ci Traceback (most recent call last): 18047db96d56Sopenharmony_ci ... 18057db96d56Sopenharmony_ci SyntaxError: invalid syntax 18067db96d56Sopenharmony_ci 18077db96d56Sopenharmony_ciInvalid bytes literals: 18087db96d56Sopenharmony_ci 18097db96d56Sopenharmony_ci >>> b"Ā" 18107db96d56Sopenharmony_ci Traceback (most recent call last): 18117db96d56Sopenharmony_ci ... 18127db96d56Sopenharmony_ci b"Ā" 18137db96d56Sopenharmony_ci ^^^ 18147db96d56Sopenharmony_ci SyntaxError: bytes can only contain ASCII literal characters 18157db96d56Sopenharmony_ci 18167db96d56Sopenharmony_ci >>> b"абвгде" 18177db96d56Sopenharmony_ci Traceback (most recent call last): 18187db96d56Sopenharmony_ci ... 18197db96d56Sopenharmony_ci b"абвгде" 18207db96d56Sopenharmony_ci ^^^^^^^^ 18217db96d56Sopenharmony_ci SyntaxError: bytes can only contain ASCII literal characters 18227db96d56Sopenharmony_ci 18237db96d56Sopenharmony_ci >>> b"abc ъющый" # first 3 letters are ascii 18247db96d56Sopenharmony_ci Traceback (most recent call last): 18257db96d56Sopenharmony_ci ... 18267db96d56Sopenharmony_ci b"abc ъющый" 18277db96d56Sopenharmony_ci ^^^^^^^^^^^ 18287db96d56Sopenharmony_ci SyntaxError: bytes can only contain ASCII literal characters 18297db96d56Sopenharmony_ci 18307db96d56Sopenharmony_ci""" 18317db96d56Sopenharmony_ci 18327db96d56Sopenharmony_ciimport re 18337db96d56Sopenharmony_ciimport doctest 18347db96d56Sopenharmony_ciimport unittest 18357db96d56Sopenharmony_ci 18367db96d56Sopenharmony_cifrom test import support 18377db96d56Sopenharmony_ci 18387db96d56Sopenharmony_ciclass SyntaxTestCase(unittest.TestCase): 18397db96d56Sopenharmony_ci 18407db96d56Sopenharmony_ci def _check_error(self, code, errtext, 18417db96d56Sopenharmony_ci filename="<testcase>", mode="exec", subclass=None, 18427db96d56Sopenharmony_ci lineno=None, offset=None, end_lineno=None, end_offset=None): 18437db96d56Sopenharmony_ci """Check that compiling code raises SyntaxError with errtext. 18447db96d56Sopenharmony_ci 18457db96d56Sopenharmony_ci errtest is a regular expression that must be present in the 18467db96d56Sopenharmony_ci test of the exception raised. If subclass is specified it 18477db96d56Sopenharmony_ci is the expected subclass of SyntaxError (e.g. IndentationError). 18487db96d56Sopenharmony_ci """ 18497db96d56Sopenharmony_ci try: 18507db96d56Sopenharmony_ci compile(code, filename, mode) 18517db96d56Sopenharmony_ci except SyntaxError as err: 18527db96d56Sopenharmony_ci if subclass and not isinstance(err, subclass): 18537db96d56Sopenharmony_ci self.fail("SyntaxError is not a %s" % subclass.__name__) 18547db96d56Sopenharmony_ci mo = re.search(errtext, str(err)) 18557db96d56Sopenharmony_ci if mo is None: 18567db96d56Sopenharmony_ci self.fail("SyntaxError did not contain %r" % (errtext,)) 18577db96d56Sopenharmony_ci self.assertEqual(err.filename, filename) 18587db96d56Sopenharmony_ci if lineno is not None: 18597db96d56Sopenharmony_ci self.assertEqual(err.lineno, lineno) 18607db96d56Sopenharmony_ci if offset is not None: 18617db96d56Sopenharmony_ci self.assertEqual(err.offset, offset) 18627db96d56Sopenharmony_ci if end_lineno is not None: 18637db96d56Sopenharmony_ci self.assertEqual(err.end_lineno, end_lineno) 18647db96d56Sopenharmony_ci if end_offset is not None: 18657db96d56Sopenharmony_ci self.assertEqual(err.end_offset, end_offset) 18667db96d56Sopenharmony_ci 18677db96d56Sopenharmony_ci else: 18687db96d56Sopenharmony_ci self.fail("compile() did not raise SyntaxError") 18697db96d56Sopenharmony_ci 18707db96d56Sopenharmony_ci def test_expression_with_assignment(self): 18717db96d56Sopenharmony_ci self._check_error( 18727db96d56Sopenharmony_ci "print(end1 + end2 = ' ')", 18737db96d56Sopenharmony_ci 'expression cannot contain assignment, perhaps you meant "=="?', 18747db96d56Sopenharmony_ci offset=7 18757db96d56Sopenharmony_ci ) 18767db96d56Sopenharmony_ci 18777db96d56Sopenharmony_ci def test_curly_brace_after_primary_raises_immediately(self): 18787db96d56Sopenharmony_ci self._check_error("f{}", "invalid syntax", mode="single") 18797db96d56Sopenharmony_ci 18807db96d56Sopenharmony_ci def test_assign_call(self): 18817db96d56Sopenharmony_ci self._check_error("f() = 1", "assign") 18827db96d56Sopenharmony_ci 18837db96d56Sopenharmony_ci def test_assign_del(self): 18847db96d56Sopenharmony_ci self._check_error("del (,)", "invalid syntax") 18857db96d56Sopenharmony_ci self._check_error("del 1", "cannot delete literal") 18867db96d56Sopenharmony_ci self._check_error("del (1, 2)", "cannot delete literal") 18877db96d56Sopenharmony_ci self._check_error("del None", "cannot delete None") 18887db96d56Sopenharmony_ci self._check_error("del *x", "cannot delete starred") 18897db96d56Sopenharmony_ci self._check_error("del (*x)", "cannot use starred expression") 18907db96d56Sopenharmony_ci self._check_error("del (*x,)", "cannot delete starred") 18917db96d56Sopenharmony_ci self._check_error("del [*x,]", "cannot delete starred") 18927db96d56Sopenharmony_ci self._check_error("del f()", "cannot delete function call") 18937db96d56Sopenharmony_ci self._check_error("del f(a, b)", "cannot delete function call") 18947db96d56Sopenharmony_ci self._check_error("del o.f()", "cannot delete function call") 18957db96d56Sopenharmony_ci self._check_error("del a[0]()", "cannot delete function call") 18967db96d56Sopenharmony_ci self._check_error("del x, f()", "cannot delete function call") 18977db96d56Sopenharmony_ci self._check_error("del f(), x", "cannot delete function call") 18987db96d56Sopenharmony_ci self._check_error("del [a, b, ((c), (d,), e.f())]", "cannot delete function call") 18997db96d56Sopenharmony_ci self._check_error("del (a if True else b)", "cannot delete conditional") 19007db96d56Sopenharmony_ci self._check_error("del +a", "cannot delete expression") 19017db96d56Sopenharmony_ci self._check_error("del a, +b", "cannot delete expression") 19027db96d56Sopenharmony_ci self._check_error("del a + b", "cannot delete expression") 19037db96d56Sopenharmony_ci self._check_error("del (a + b, c)", "cannot delete expression") 19047db96d56Sopenharmony_ci self._check_error("del (c[0], a + b)", "cannot delete expression") 19057db96d56Sopenharmony_ci self._check_error("del a.b.c + 2", "cannot delete expression") 19067db96d56Sopenharmony_ci self._check_error("del a.b.c[0] + 2", "cannot delete expression") 19077db96d56Sopenharmony_ci self._check_error("del (a, b, (c, d.e.f + 2))", "cannot delete expression") 19087db96d56Sopenharmony_ci self._check_error("del [a, b, (c, d.e.f[0] + 2)]", "cannot delete expression") 19097db96d56Sopenharmony_ci self._check_error("del (a := 5)", "cannot delete named expression") 19107db96d56Sopenharmony_ci # We don't have a special message for this, but make sure we don't 19117db96d56Sopenharmony_ci # report "cannot delete name" 19127db96d56Sopenharmony_ci self._check_error("del a += b", "invalid syntax") 19137db96d56Sopenharmony_ci 19147db96d56Sopenharmony_ci def test_global_param_err_first(self): 19157db96d56Sopenharmony_ci source = """if 1: 19167db96d56Sopenharmony_ci def error(a): 19177db96d56Sopenharmony_ci global a # SyntaxError 19187db96d56Sopenharmony_ci def error2(): 19197db96d56Sopenharmony_ci b = 1 19207db96d56Sopenharmony_ci global b # SyntaxError 19217db96d56Sopenharmony_ci """ 19227db96d56Sopenharmony_ci self._check_error(source, "parameter and global", lineno=3) 19237db96d56Sopenharmony_ci 19247db96d56Sopenharmony_ci def test_nonlocal_param_err_first(self): 19257db96d56Sopenharmony_ci source = """if 1: 19267db96d56Sopenharmony_ci def error(a): 19277db96d56Sopenharmony_ci nonlocal a # SyntaxError 19287db96d56Sopenharmony_ci def error2(): 19297db96d56Sopenharmony_ci b = 1 19307db96d56Sopenharmony_ci global b # SyntaxError 19317db96d56Sopenharmony_ci """ 19327db96d56Sopenharmony_ci self._check_error(source, "parameter and nonlocal", lineno=3) 19337db96d56Sopenharmony_ci 19347db96d56Sopenharmony_ci def test_yield_outside_function(self): 19357db96d56Sopenharmony_ci self._check_error("if 0: yield", "outside function") 19367db96d56Sopenharmony_ci self._check_error("if 0: yield\nelse: x=1", "outside function") 19377db96d56Sopenharmony_ci self._check_error("if 1: pass\nelse: yield", "outside function") 19387db96d56Sopenharmony_ci self._check_error("while 0: yield", "outside function") 19397db96d56Sopenharmony_ci self._check_error("while 0: yield\nelse: x=1", "outside function") 19407db96d56Sopenharmony_ci self._check_error("class C:\n if 0: yield", "outside function") 19417db96d56Sopenharmony_ci self._check_error("class C:\n if 1: pass\n else: yield", 19427db96d56Sopenharmony_ci "outside function") 19437db96d56Sopenharmony_ci self._check_error("class C:\n while 0: yield", "outside function") 19447db96d56Sopenharmony_ci self._check_error("class C:\n while 0: yield\n else: x = 1", 19457db96d56Sopenharmony_ci "outside function") 19467db96d56Sopenharmony_ci 19477db96d56Sopenharmony_ci def test_return_outside_function(self): 19487db96d56Sopenharmony_ci self._check_error("if 0: return", "outside function") 19497db96d56Sopenharmony_ci self._check_error("if 0: return\nelse: x=1", "outside function") 19507db96d56Sopenharmony_ci self._check_error("if 1: pass\nelse: return", "outside function") 19517db96d56Sopenharmony_ci self._check_error("while 0: return", "outside function") 19527db96d56Sopenharmony_ci self._check_error("class C:\n if 0: return", "outside function") 19537db96d56Sopenharmony_ci self._check_error("class C:\n while 0: return", "outside function") 19547db96d56Sopenharmony_ci self._check_error("class C:\n while 0: return\n else: x=1", 19557db96d56Sopenharmony_ci "outside function") 19567db96d56Sopenharmony_ci self._check_error("class C:\n if 0: return\n else: x= 1", 19577db96d56Sopenharmony_ci "outside function") 19587db96d56Sopenharmony_ci self._check_error("class C:\n if 1: pass\n else: return", 19597db96d56Sopenharmony_ci "outside function") 19607db96d56Sopenharmony_ci 19617db96d56Sopenharmony_ci def test_break_outside_loop(self): 19627db96d56Sopenharmony_ci msg = "outside loop" 19637db96d56Sopenharmony_ci self._check_error("break", msg, lineno=1) 19647db96d56Sopenharmony_ci self._check_error("if 0: break", msg, lineno=1) 19657db96d56Sopenharmony_ci self._check_error("if 0: break\nelse: x=1", msg, lineno=1) 19667db96d56Sopenharmony_ci self._check_error("if 1: pass\nelse: break", msg, lineno=2) 19677db96d56Sopenharmony_ci self._check_error("class C:\n if 0: break", msg, lineno=2) 19687db96d56Sopenharmony_ci self._check_error("class C:\n if 1: pass\n else: break", 19697db96d56Sopenharmony_ci msg, lineno=3) 19707db96d56Sopenharmony_ci self._check_error("with object() as obj:\n break", 19717db96d56Sopenharmony_ci msg, lineno=2) 19727db96d56Sopenharmony_ci 19737db96d56Sopenharmony_ci def test_continue_outside_loop(self): 19747db96d56Sopenharmony_ci msg = "not properly in loop" 19757db96d56Sopenharmony_ci self._check_error("if 0: continue", msg, lineno=1) 19767db96d56Sopenharmony_ci self._check_error("if 0: continue\nelse: x=1", msg, lineno=1) 19777db96d56Sopenharmony_ci self._check_error("if 1: pass\nelse: continue", msg, lineno=2) 19787db96d56Sopenharmony_ci self._check_error("class C:\n if 0: continue", msg, lineno=2) 19797db96d56Sopenharmony_ci self._check_error("class C:\n if 1: pass\n else: continue", 19807db96d56Sopenharmony_ci msg, lineno=3) 19817db96d56Sopenharmony_ci self._check_error("with object() as obj:\n continue", 19827db96d56Sopenharmony_ci msg, lineno=2) 19837db96d56Sopenharmony_ci 19847db96d56Sopenharmony_ci def test_unexpected_indent(self): 19857db96d56Sopenharmony_ci self._check_error("foo()\n bar()\n", "unexpected indent", 19867db96d56Sopenharmony_ci subclass=IndentationError) 19877db96d56Sopenharmony_ci 19887db96d56Sopenharmony_ci def test_no_indent(self): 19897db96d56Sopenharmony_ci self._check_error("if 1:\nfoo()", "expected an indented block", 19907db96d56Sopenharmony_ci subclass=IndentationError) 19917db96d56Sopenharmony_ci 19927db96d56Sopenharmony_ci def test_bad_outdent(self): 19937db96d56Sopenharmony_ci self._check_error("if 1:\n foo()\n bar()", 19947db96d56Sopenharmony_ci "unindent does not match .* level", 19957db96d56Sopenharmony_ci subclass=IndentationError) 19967db96d56Sopenharmony_ci 19977db96d56Sopenharmony_ci def test_kwargs_last(self): 19987db96d56Sopenharmony_ci self._check_error("int(base=10, '2')", 19997db96d56Sopenharmony_ci "positional argument follows keyword argument") 20007db96d56Sopenharmony_ci 20017db96d56Sopenharmony_ci def test_kwargs_last2(self): 20027db96d56Sopenharmony_ci self._check_error("int(**{'base': 10}, '2')", 20037db96d56Sopenharmony_ci "positional argument follows " 20047db96d56Sopenharmony_ci "keyword argument unpacking") 20057db96d56Sopenharmony_ci 20067db96d56Sopenharmony_ci def test_kwargs_last3(self): 20077db96d56Sopenharmony_ci self._check_error("int(**{'base': 10}, *['2'])", 20087db96d56Sopenharmony_ci "iterable argument unpacking follows " 20097db96d56Sopenharmony_ci "keyword argument unpacking") 20107db96d56Sopenharmony_ci 20117db96d56Sopenharmony_ci def test_generator_in_function_call(self): 20127db96d56Sopenharmony_ci self._check_error("foo(x, y for y in range(3) for z in range(2) if z , p)", 20137db96d56Sopenharmony_ci "Generator expression must be parenthesized", 20147db96d56Sopenharmony_ci lineno=1, end_lineno=1, offset=11, end_offset=53) 20157db96d56Sopenharmony_ci 20167db96d56Sopenharmony_ci def test_except_then_except_star(self): 20177db96d56Sopenharmony_ci self._check_error("try: pass\nexcept ValueError: pass\nexcept* TypeError: pass", 20187db96d56Sopenharmony_ci r"cannot have both 'except' and 'except\*' on the same 'try'", 20197db96d56Sopenharmony_ci lineno=3, end_lineno=3, offset=1, end_offset=8) 20207db96d56Sopenharmony_ci 20217db96d56Sopenharmony_ci def test_except_star_then_except(self): 20227db96d56Sopenharmony_ci self._check_error("try: pass\nexcept* ValueError: pass\nexcept TypeError: pass", 20237db96d56Sopenharmony_ci r"cannot have both 'except' and 'except\*' on the same 'try'", 20247db96d56Sopenharmony_ci lineno=3, end_lineno=3, offset=1, end_offset=7) 20257db96d56Sopenharmony_ci 20267db96d56Sopenharmony_ci def test_empty_line_after_linecont(self): 20277db96d56Sopenharmony_ci # See issue-40847 20287db96d56Sopenharmony_ci s = r"""\ 20297db96d56Sopenharmony_cipass 20307db96d56Sopenharmony_ci \ 20317db96d56Sopenharmony_ci 20327db96d56Sopenharmony_cipass 20337db96d56Sopenharmony_ci""" 20347db96d56Sopenharmony_ci try: 20357db96d56Sopenharmony_ci compile(s, '<string>', 'exec') 20367db96d56Sopenharmony_ci except SyntaxError: 20377db96d56Sopenharmony_ci self.fail("Empty line after a line continuation character is valid.") 20387db96d56Sopenharmony_ci 20397db96d56Sopenharmony_ci # See issue-46091 20407db96d56Sopenharmony_ci s1 = r"""\ 20417db96d56Sopenharmony_cidef fib(n): 20427db96d56Sopenharmony_ci \ 20437db96d56Sopenharmony_ci'''Print a Fibonacci series up to n.''' 20447db96d56Sopenharmony_ci \ 20457db96d56Sopenharmony_cia, b = 0, 1 20467db96d56Sopenharmony_ci""" 20477db96d56Sopenharmony_ci s2 = r"""\ 20487db96d56Sopenharmony_cidef fib(n): 20497db96d56Sopenharmony_ci '''Print a Fibonacci series up to n.''' 20507db96d56Sopenharmony_ci a, b = 0, 1 20517db96d56Sopenharmony_ci""" 20527db96d56Sopenharmony_ci try: 20537db96d56Sopenharmony_ci compile(s1, '<string>', 'exec') 20547db96d56Sopenharmony_ci compile(s2, '<string>', 'exec') 20557db96d56Sopenharmony_ci except SyntaxError: 20567db96d56Sopenharmony_ci self.fail("Indented statement over multiple lines is valid") 20577db96d56Sopenharmony_ci 20587db96d56Sopenharmony_ci def test_continuation_bad_indentation(self): 20597db96d56Sopenharmony_ci # Check that code that breaks indentation across multiple lines raises a syntax error 20607db96d56Sopenharmony_ci 20617db96d56Sopenharmony_ci code = r"""\ 20627db96d56Sopenharmony_ciif x: 20637db96d56Sopenharmony_ci y = 1 20647db96d56Sopenharmony_ci \ 20657db96d56Sopenharmony_ci foo = 1 20667db96d56Sopenharmony_ci """ 20677db96d56Sopenharmony_ci 20687db96d56Sopenharmony_ci self.assertRaises(IndentationError, exec, code) 20697db96d56Sopenharmony_ci 20707db96d56Sopenharmony_ci @support.cpython_only 20717db96d56Sopenharmony_ci def test_nested_named_except_blocks(self): 20727db96d56Sopenharmony_ci code = "" 20737db96d56Sopenharmony_ci for i in range(12): 20747db96d56Sopenharmony_ci code += f"{' '*i}try:\n" 20757db96d56Sopenharmony_ci code += f"{' '*(i+1)}raise Exception\n" 20767db96d56Sopenharmony_ci code += f"{' '*i}except Exception as e:\n" 20777db96d56Sopenharmony_ci code += f"{' '*4*12}pass" 20787db96d56Sopenharmony_ci self._check_error(code, "too many statically nested blocks") 20797db96d56Sopenharmony_ci 20807db96d56Sopenharmony_ci def test_barry_as_flufl_with_syntax_errors(self): 20817db96d56Sopenharmony_ci # The "barry_as_flufl" rule can produce some "bugs-at-a-distance" if 20827db96d56Sopenharmony_ci # is reading the wrong token in the presence of syntax errors later 20837db96d56Sopenharmony_ci # in the file. See bpo-42214 for more information. 20847db96d56Sopenharmony_ci code = """ 20857db96d56Sopenharmony_cidef func1(): 20867db96d56Sopenharmony_ci if a != b: 20877db96d56Sopenharmony_ci raise ValueError 20887db96d56Sopenharmony_ci 20897db96d56Sopenharmony_cidef func2(): 20907db96d56Sopenharmony_ci try 20917db96d56Sopenharmony_ci return 1 20927db96d56Sopenharmony_ci finally: 20937db96d56Sopenharmony_ci pass 20947db96d56Sopenharmony_ci""" 20957db96d56Sopenharmony_ci self._check_error(code, "expected ':'") 20967db96d56Sopenharmony_ci 20977db96d56Sopenharmony_ci def test_invalid_line_continuation_error_position(self): 20987db96d56Sopenharmony_ci self._check_error(r"a = 3 \ 4", 20997db96d56Sopenharmony_ci "unexpected character after line continuation character", 21007db96d56Sopenharmony_ci lineno=1, offset=8) 21017db96d56Sopenharmony_ci self._check_error('1,\\#\n2', 21027db96d56Sopenharmony_ci "unexpected character after line continuation character", 21037db96d56Sopenharmony_ci lineno=1, offset=4) 21047db96d56Sopenharmony_ci self._check_error('\nfgdfgf\n1,\\#\n2\n', 21057db96d56Sopenharmony_ci "unexpected character after line continuation character", 21067db96d56Sopenharmony_ci lineno=3, offset=4) 21077db96d56Sopenharmony_ci 21087db96d56Sopenharmony_ci def test_invalid_line_continuation_left_recursive(self): 21097db96d56Sopenharmony_ci # Check bpo-42218: SyntaxErrors following left-recursive rules 21107db96d56Sopenharmony_ci # (t_primary_raw in this case) need to be tested explicitly 21117db96d56Sopenharmony_ci self._check_error("A.\u018a\\ ", 21127db96d56Sopenharmony_ci "unexpected character after line continuation character") 21137db96d56Sopenharmony_ci self._check_error("A.\u03bc\\\n", 21147db96d56Sopenharmony_ci "unexpected EOF while parsing") 21157db96d56Sopenharmony_ci 21167db96d56Sopenharmony_ci def test_error_parenthesis(self): 21177db96d56Sopenharmony_ci for paren in "([{": 21187db96d56Sopenharmony_ci self._check_error(paren + "1 + 2", f"\\{paren}' was never closed") 21197db96d56Sopenharmony_ci 21207db96d56Sopenharmony_ci for paren in "([{": 21217db96d56Sopenharmony_ci self._check_error(f"a = {paren} 1, 2, 3\nb=3", f"\\{paren}' was never closed") 21227db96d56Sopenharmony_ci 21237db96d56Sopenharmony_ci for paren in ")]}": 21247db96d56Sopenharmony_ci self._check_error(paren + "1 + 2", f"unmatched '\\{paren}'") 21257db96d56Sopenharmony_ci 21267db96d56Sopenharmony_ci # Some more complex examples: 21277db96d56Sopenharmony_ci code = """\ 21287db96d56Sopenharmony_cifunc( 21297db96d56Sopenharmony_ci a=["unclosed], # Need a quote in this comment: " 21307db96d56Sopenharmony_ci b=2, 21317db96d56Sopenharmony_ci) 21327db96d56Sopenharmony_ci""" 21337db96d56Sopenharmony_ci self._check_error(code, "parenthesis '\\)' does not match opening parenthesis '\\['") 21347db96d56Sopenharmony_ci 21357db96d56Sopenharmony_ci def test_error_string_literal(self): 21367db96d56Sopenharmony_ci 21377db96d56Sopenharmony_ci self._check_error("'blech", "unterminated string literal") 21387db96d56Sopenharmony_ci self._check_error('"blech', "unterminated string literal") 21397db96d56Sopenharmony_ci self._check_error("'''blech", "unterminated triple-quoted string literal") 21407db96d56Sopenharmony_ci self._check_error('"""blech', "unterminated triple-quoted string literal") 21417db96d56Sopenharmony_ci 21427db96d56Sopenharmony_ci def test_invisible_characters(self): 21437db96d56Sopenharmony_ci self._check_error('print\x17("Hello")', "invalid non-printable character") 21447db96d56Sopenharmony_ci 21457db96d56Sopenharmony_ci def test_match_call_does_not_raise_syntax_error(self): 21467db96d56Sopenharmony_ci code = """ 21477db96d56Sopenharmony_cidef match(x): 21487db96d56Sopenharmony_ci return 1+1 21497db96d56Sopenharmony_ci 21507db96d56Sopenharmony_cimatch(34) 21517db96d56Sopenharmony_ci""" 21527db96d56Sopenharmony_ci compile(code, "<string>", "exec") 21537db96d56Sopenharmony_ci 21547db96d56Sopenharmony_ci def test_case_call_does_not_raise_syntax_error(self): 21557db96d56Sopenharmony_ci code = """ 21567db96d56Sopenharmony_cidef case(x): 21577db96d56Sopenharmony_ci return 1+1 21587db96d56Sopenharmony_ci 21597db96d56Sopenharmony_cicase(34) 21607db96d56Sopenharmony_ci""" 21617db96d56Sopenharmony_ci compile(code, "<string>", "exec") 21627db96d56Sopenharmony_ci 21637db96d56Sopenharmony_ci def test_multiline_compiler_error_points_to_the_end(self): 21647db96d56Sopenharmony_ci self._check_error( 21657db96d56Sopenharmony_ci "call(\na=1,\na=1\n)", 21667db96d56Sopenharmony_ci "keyword argument repeated", 21677db96d56Sopenharmony_ci lineno=3 21687db96d56Sopenharmony_ci ) 21697db96d56Sopenharmony_ci 21707db96d56Sopenharmony_ci @support.cpython_only 21717db96d56Sopenharmony_ci def test_syntax_error_on_deeply_nested_blocks(self): 21727db96d56Sopenharmony_ci # This raises a SyntaxError, it used to raise a SystemError. Context 21737db96d56Sopenharmony_ci # for this change can be found on issue #27514 21747db96d56Sopenharmony_ci 21757db96d56Sopenharmony_ci # In 2.5 there was a missing exception and an assert was triggered in a 21767db96d56Sopenharmony_ci # debug build. The number of blocks must be greater than CO_MAXBLOCKS. 21777db96d56Sopenharmony_ci # SF #1565514 21787db96d56Sopenharmony_ci 21797db96d56Sopenharmony_ci source = """ 21807db96d56Sopenharmony_ciwhile 1: 21817db96d56Sopenharmony_ci while 2: 21827db96d56Sopenharmony_ci while 3: 21837db96d56Sopenharmony_ci while 4: 21847db96d56Sopenharmony_ci while 5: 21857db96d56Sopenharmony_ci while 6: 21867db96d56Sopenharmony_ci while 8: 21877db96d56Sopenharmony_ci while 9: 21887db96d56Sopenharmony_ci while 10: 21897db96d56Sopenharmony_ci while 11: 21907db96d56Sopenharmony_ci while 12: 21917db96d56Sopenharmony_ci while 13: 21927db96d56Sopenharmony_ci while 14: 21937db96d56Sopenharmony_ci while 15: 21947db96d56Sopenharmony_ci while 16: 21957db96d56Sopenharmony_ci while 17: 21967db96d56Sopenharmony_ci while 18: 21977db96d56Sopenharmony_ci while 19: 21987db96d56Sopenharmony_ci while 20: 21997db96d56Sopenharmony_ci while 21: 22007db96d56Sopenharmony_ci while 22: 22017db96d56Sopenharmony_ci break 22027db96d56Sopenharmony_ci""" 22037db96d56Sopenharmony_ci self._check_error(source, "too many statically nested blocks") 22047db96d56Sopenharmony_ci 22057db96d56Sopenharmony_ci @support.cpython_only 22067db96d56Sopenharmony_ci def test_error_on_parser_stack_overflow(self): 22077db96d56Sopenharmony_ci source = "-" * 100000 + "4" 22087db96d56Sopenharmony_ci for mode in ["exec", "eval", "single"]: 22097db96d56Sopenharmony_ci with self.subTest(mode=mode): 22107db96d56Sopenharmony_ci with self.assertRaises(MemoryError): 22117db96d56Sopenharmony_ci compile(source, "<string>", mode) 22127db96d56Sopenharmony_ci 22137db96d56Sopenharmony_ci @support.cpython_only 22147db96d56Sopenharmony_ci def test_deep_invalid_rule(self): 22157db96d56Sopenharmony_ci # Check that a very deep invalid rule in the PEG 22167db96d56Sopenharmony_ci # parser doesn't have exponential backtracking. 22177db96d56Sopenharmony_ci source = "d{{{{{{{{{{{{{{{{{{{{{{{{{```{{{{{{{ef f():y" 22187db96d56Sopenharmony_ci with self.assertRaises(SyntaxError): 22197db96d56Sopenharmony_ci compile(source, "<string>", "exec") 22207db96d56Sopenharmony_ci 22217db96d56Sopenharmony_ci 22227db96d56Sopenharmony_cidef load_tests(loader, tests, pattern): 22237db96d56Sopenharmony_ci tests.addTest(doctest.DocTestSuite()) 22247db96d56Sopenharmony_ci return tests 22257db96d56Sopenharmony_ci 22267db96d56Sopenharmony_ci 22277db96d56Sopenharmony_ciif __name__ == "__main__": 22287db96d56Sopenharmony_ci unittest.main() 2229