blob: 5f622b092f98f8257c9b4232d26a5ba32204efbe [file] [log] [blame]
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001"""This module tests SyntaxErrors.
2
3Here's an example of the sort of thing that is tested.
4
5>>> def f(x):
6... global x
7Traceback (most recent call last):
Nick Coghlan650f0d02007-04-15 12:05:43 +00008SyntaxError: name 'x' is parameter and global
Jeremy Hyltonc960f262006-01-27 15:18:39 +00009
10The tests are all raise SyntaxErrors. They were created by checking
11each C call that raises SyntaxError. There are several modules that
12raise these exceptions-- ast.c, compile.c, future.c, pythonrun.c, and
13symtable.c.
14
15The parser itself outlaws a lot of invalid syntax. None of these
16errors are tested here at the moment. We should add some tests; since
17there are infinitely many programs with invalid syntax, we would need
18to be judicious in selecting some.
19
20The compiler generates a synthetic module name for code executed by
21doctest. Since all the code comes from the same module, a suffix like
22[1] is appended to the module name, As a consequence, changing the
23order of tests in this module means renumbering all the errors after
24it. (Maybe we should enable the ellipsis option for these tests.)
25
26In ast.c, syntax errors are raised by calling ast_error().
27
28Errors from set_context():
29
Jeremy Hyltonc960f262006-01-27 15:18:39 +000030>>> obj.None = 1
31Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +000032SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +000033
34>>> None = 1
35Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +020036SyntaxError: cannot assign to None
37
38>>> obj.True = 1
39Traceback (most recent call last):
40SyntaxError: invalid syntax
41
42>>> True = 1
43Traceback (most recent call last):
44SyntaxError: cannot assign to True
45
Serhiy Storchakad8b3a982019-03-05 20:42:06 +020046>>> (True := 1)
47Traceback (most recent call last):
Ned Batchelder37143a82019-12-31 21:40:58 -050048SyntaxError: cannot use assignment expressions with True
Serhiy Storchakad8b3a982019-03-05 20:42:06 +020049
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +020050>>> obj.__debug__ = 1
51Traceback (most recent call last):
52SyntaxError: cannot assign to __debug__
53
54>>> __debug__ = 1
55Traceback (most recent call last):
56SyntaxError: cannot assign to __debug__
Jeremy Hyltonc960f262006-01-27 15:18:39 +000057
Stéphane Wirtel3ad91672019-02-21 11:11:53 +010058>>> (__debug__ := 1)
59Traceback (most recent call last):
60SyntaxError: cannot assign to __debug__
61
Jeremy Hyltonc960f262006-01-27 15:18:39 +000062>>> f() = 1
63Traceback (most recent call last):
Pablo Galindob86ed8e2021-04-12 16:59:30 +010064SyntaxError: cannot assign to function call here. Maybe you meant '==' instead of '='?
Jeremy Hyltonc960f262006-01-27 15:18:39 +000065
Pablo Galindo9f495902020-06-08 02:57:00 +010066>>> yield = 1
67Traceback (most recent call last):
68SyntaxError: assignment to yield expression not possible
69
Shantanu27c0d9b2020-05-11 14:53:58 -070070>>> del f()
71Traceback (most recent call last):
72SyntaxError: cannot delete function call
Jeremy Hyltonc960f262006-01-27 15:18:39 +000073
74>>> a + 1 = 2
75Traceback (most recent call last):
Pablo Galindob86ed8e2021-04-12 16:59:30 +010076SyntaxError: cannot assign to expression here. Maybe you meant '==' instead of '='?
Jeremy Hyltonc960f262006-01-27 15:18:39 +000077
78>>> (x for x in x) = 1
79Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +020080SyntaxError: cannot assign to generator expression
Jeremy Hyltonc960f262006-01-27 15:18:39 +000081
82>>> 1 = 1
83Traceback (most recent call last):
Pablo Galindob86ed8e2021-04-12 16:59:30 +010084SyntaxError: cannot assign to literal here. Maybe you meant '==' instead of '='?
Jeremy Hyltonc960f262006-01-27 15:18:39 +000085
86>>> "abc" = 1
87Traceback (most recent call last):
Pablo Galindob86ed8e2021-04-12 16:59:30 +010088SyntaxError: cannot assign to literal here. Maybe you meant '==' instead of '='?
Jeremy Hyltonc960f262006-01-27 15:18:39 +000089
Benjamin Petersonbd3e3622011-04-12 18:33:28 -050090>>> b"" = 1
91Traceback (most recent call last):
Pablo Galindob86ed8e2021-04-12 16:59:30 +010092SyntaxError: cannot assign to literal here. Maybe you meant '==' instead of '='?
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +020093
94>>> ... = 1
95Traceback (most recent call last):
Pablo Galindob86ed8e2021-04-12 16:59:30 +010096SyntaxError: cannot assign to Ellipsis here. Maybe you meant '==' instead of '='?
Benjamin Petersonbd3e3622011-04-12 18:33:28 -050097
Jeremy Hyltonc960f262006-01-27 15:18:39 +000098>>> `1` = 1
99Traceback (most recent call last):
Brett Cannon8933cb42006-08-25 04:12:10 +0000100SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000101
102If the left-hand side of an assignment is a list or tuple, an illegal
103expression inside that contain should still cause a syntax error.
104This test just checks a couple of cases rather than enumerating all of
105them.
106
Pablo Galindo16ab0702020-05-15 02:04:52 +0100107>>> (a, "b", c) = (1, 2, 3)
108Traceback (most recent call last):
109SyntaxError: cannot assign to literal
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200110
Pablo Galindo16ab0702020-05-15 02:04:52 +0100111>>> (a, True, c) = (1, 2, 3)
112Traceback (most recent call last):
113SyntaxError: cannot assign to True
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200114
115>>> (a, __debug__, c) = (1, 2, 3)
116Traceback (most recent call last):
117SyntaxError: cannot assign to __debug__
118
Pablo Galindo16ab0702020-05-15 02:04:52 +0100119>>> (a, *True, c) = (1, 2, 3)
120Traceback (most recent call last):
121SyntaxError: cannot assign to True
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200122
123>>> (a, *__debug__, c) = (1, 2, 3)
124Traceback (most recent call last):
125SyntaxError: cannot assign to __debug__
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000126
Pablo Galindo16ab0702020-05-15 02:04:52 +0100127>>> [a, b, c + 1] = [1, 2, 3]
128Traceback (most recent call last):
Pablo Galindob86ed8e2021-04-12 16:59:30 +0100129SyntaxError: cannot assign to expression
Pablo Galindo16ab0702020-05-15 02:04:52 +0100130
131>>> [a, b[1], c + 1] = [1, 2, 3]
132Traceback (most recent call last):
Pablo Galindob86ed8e2021-04-12 16:59:30 +0100133SyntaxError: cannot assign to expression
Pablo Galindo16ab0702020-05-15 02:04:52 +0100134
135>>> [a, b.c.d, c + 1] = [1, 2, 3]
136Traceback (most recent call last):
Pablo Galindob86ed8e2021-04-12 16:59:30 +0100137SyntaxError: cannot assign to expression
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000138
Thomas Wouters477c8d52006-05-27 19:21:47 +0000139>>> a if 1 else b = 1
140Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200141SyntaxError: cannot assign to conditional expression
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000142
Pablo Galindo9f495902020-06-08 02:57:00 +0100143>>> True = True = 3
144Traceback (most recent call last):
145SyntaxError: cannot assign to True
146
147>>> x = y = True = z = 3
148Traceback (most recent call last):
149SyntaxError: cannot assign to True
150
151>>> x = y = yield = 1
152Traceback (most recent call last):
153SyntaxError: assignment to yield expression not possible
154
Lysandros Nikolaouce21cfc2020-05-14 23:13:50 +0300155>>> a, b += 1, 2
156Traceback (most recent call last):
Pablo Galindo16ab0702020-05-15 02:04:52 +0100157SyntaxError: 'tuple' is an illegal expression for augmented assignment
Lysandros Nikolaouce21cfc2020-05-14 23:13:50 +0300158
159>>> (a, b) += 1, 2
160Traceback (most recent call last):
Pablo Galindo16ab0702020-05-15 02:04:52 +0100161SyntaxError: 'tuple' is an illegal expression for augmented assignment
Lysandros Nikolaouce21cfc2020-05-14 23:13:50 +0300162
163>>> [a, b] += 1, 2
164Traceback (most recent call last):
Pablo Galindo16ab0702020-05-15 02:04:52 +0100165SyntaxError: 'list' is an illegal expression for augmented assignment
Lysandros Nikolaouce21cfc2020-05-14 23:13:50 +0300166
Lysandros Nikolaou01ece632020-06-19 02:10:43 +0300167Invalid targets in `for` loops and `with` statements should also
168produce a specialized error message
169
170>>> for a() in b: pass
171Traceback (most recent call last):
172SyntaxError: cannot assign to function call
173
174>>> for (a, b()) in b: pass
175Traceback (most recent call last):
176SyntaxError: cannot assign to function call
177
178>>> for [a, b()] in b: pass
179Traceback (most recent call last):
180SyntaxError: cannot assign to function call
181
182>>> for (*a, b, c+1) in b: pass
183Traceback (most recent call last):
Pablo Galindob86ed8e2021-04-12 16:59:30 +0100184SyntaxError: cannot assign to expression
Lysandros Nikolaou01ece632020-06-19 02:10:43 +0300185
186>>> for (x, *(y, z.d())) in b: pass
187Traceback (most recent call last):
188SyntaxError: cannot assign to function call
189
190>>> for a, b() in c: pass
191Traceback (most recent call last):
192SyntaxError: cannot assign to function call
193
194>>> for a, b, (c + 1, d()): pass
195Traceback (most recent call last):
Pablo Galindob86ed8e2021-04-12 16:59:30 +0100196SyntaxError: cannot assign to expression
Lysandros Nikolaou01ece632020-06-19 02:10:43 +0300197
198>>> for i < (): pass
199Traceback (most recent call last):
200SyntaxError: invalid syntax
201
Lysandros Nikolaou6c4e0bd2020-06-21 05:18:01 +0300202>>> for a, b
203Traceback (most recent call last):
204SyntaxError: invalid syntax
205
Lysandros Nikolaou01ece632020-06-19 02:10:43 +0300206>>> with a as b(): pass
207Traceback (most recent call last):
208SyntaxError: cannot assign to function call
209
210>>> with a as (b, c()): pass
211Traceback (most recent call last):
212SyntaxError: cannot assign to function call
213
214>>> with a as [b, c()]: pass
215Traceback (most recent call last):
216SyntaxError: cannot assign to function call
217
218>>> with a as (*b, c, d+1): pass
219Traceback (most recent call last):
Pablo Galindob86ed8e2021-04-12 16:59:30 +0100220SyntaxError: cannot assign to expression
Lysandros Nikolaou01ece632020-06-19 02:10:43 +0300221
222>>> with a as (x, *(y, z.d())): pass
223Traceback (most recent call last):
224SyntaxError: cannot assign to function call
225
226>>> with a as b, c as d(): pass
227Traceback (most recent call last):
228SyntaxError: cannot assign to function call
229
Lysandros Nikolaou6c4e0bd2020-06-21 05:18:01 +0300230>>> with a as b
231Traceback (most recent call last):
Pablo Galindo58fb1562021-02-02 19:54:22 +0000232SyntaxError: expected ':'
Lysandros Nikolaou6c4e0bd2020-06-21 05:18:01 +0300233
Pablo Galindo9f495902020-06-08 02:57:00 +0100234>>> p = p =
235Traceback (most recent call last):
236SyntaxError: invalid syntax
237
Pablo Galindo835f14f2021-01-31 22:52:56 +0000238Comprehensions creating tuples without parentheses
239should produce a specialized error message:
240
241>>> [x,y for x,y in range(100)]
242Traceback (most recent call last):
243SyntaxError: did you forget parentheses around the comprehension target?
244
245>>> {x,y for x,y in range(100)}
246Traceback (most recent call last):
247SyntaxError: did you forget parentheses around the comprehension target?
248
Pablo Galindod4e6ed72021-02-03 23:29:26 +0000249# Missing commas in literals collections should not
250# produce special error messages regarding missing
Pablo Galindob2802482021-04-15 21:38:45 +0100251# parentheses, but about missing commas instead
Pablo Galindod4e6ed72021-02-03 23:29:26 +0000252
253>>> [1, 2 3]
Pablo Galindo835f14f2021-01-31 22:52:56 +0000254Traceback (most recent call last):
Pablo Galindob2802482021-04-15 21:38:45 +0100255SyntaxError: invalid syntax. Perhaps you forgot a comma?
Pablo Galindod4e6ed72021-02-03 23:29:26 +0000256
257>>> {1, 2 3}
258Traceback (most recent call last):
Pablo Galindob2802482021-04-15 21:38:45 +0100259SyntaxError: invalid syntax. Perhaps you forgot a comma?
Pablo Galindod4e6ed72021-02-03 23:29:26 +0000260
261>>> {1:2, 2:5 3:12}
262Traceback (most recent call last):
Pablo Galindob2802482021-04-15 21:38:45 +0100263SyntaxError: invalid syntax. Perhaps you forgot a comma?
Pablo Galindod4e6ed72021-02-03 23:29:26 +0000264
265>>> (1, 2 3)
266Traceback (most recent call last):
Pablo Galindob2802482021-04-15 21:38:45 +0100267SyntaxError: invalid syntax. Perhaps you forgot a comma?
268
269# Make sure soft keywords constructs don't raise specialized
270# errors regarding missing commas
271
272>>> match x:
273... y = 3
274Traceback (most recent call last):
275SyntaxError: invalid syntax
276
277>>> match x:
278... case y:
279... 3 $ 3
280Traceback (most recent call last):
Pablo Galindod4e6ed72021-02-03 23:29:26 +0000281SyntaxError: invalid syntax
Pablo Galindo835f14f2021-01-31 22:52:56 +0000282
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000283From compiler_complex_args():
284
285>>> def f(None=1):
286... pass
287Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +0000288SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000289
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000290From ast_for_arguments():
291
292>>> def f(x, y=1, z):
293... pass
294Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +0000295SyntaxError: non-default argument follows default argument
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000296
297>>> def f(x, None):
298... pass
299Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +0000300SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000301
302>>> def f(*None):
303... pass
304Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +0000305SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000306
307>>> def f(**None):
308... pass
309Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +0000310SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000311
Lysandros Nikolaou75b863a2020-05-18 22:14:47 +0300312>>> import ast; ast.parse('''
313... def f(
314... *, # type: int
315... a, # type: int
316... ):
317... pass
318... ''', type_comments=True)
319Traceback (most recent call last):
320SyntaxError: bare * has associated type comment
321
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000322
323From ast_for_funcdef():
324
325>>> def None(x):
326... pass
327Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +0000328SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000329
330
331From ast_for_call():
332
Serhiy Storchaka9165f772017-11-15 08:49:40 +0200333>>> def f(it, *varargs, **kwargs):
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000334... return list(it)
335>>> L = range(10)
336>>> f(x for x in L)
337[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
338>>> f(x for x in L, 1)
339Traceback (most recent call last):
Serhiy Storchaka9165f772017-11-15 08:49:40 +0200340SyntaxError: Generator expression must be parenthesized
341>>> f(x for x in L, y=1)
342Traceback (most recent call last):
343SyntaxError: Generator expression must be parenthesized
344>>> f(x for x in L, *[])
345Traceback (most recent call last):
346SyntaxError: Generator expression must be parenthesized
347>>> f(x for x in L, **{})
348Traceback (most recent call last):
349SyntaxError: Generator expression must be parenthesized
Lysandros Nikolaouae145832020-05-22 03:56:52 +0300350>>> f(L, x for x in L)
351Traceback (most recent call last):
352SyntaxError: Generator expression must be parenthesized
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400353>>> f(x for x in L, y for y in L)
354Traceback (most recent call last):
Serhiy Storchaka9165f772017-11-15 08:49:40 +0200355SyntaxError: Generator expression must be parenthesized
356>>> f(x for x in L,)
357Traceback (most recent call last):
358SyntaxError: Generator expression must be parenthesized
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000359>>> f((x for x in L), 1)
360[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Serhiy Storchakaddbce132017-11-15 17:39:37 +0200361>>> class C(x for x in L):
362... pass
363Traceback (most recent call last):
Pablo Galindo58fb1562021-02-02 19:54:22 +0000364SyntaxError: expected ':'
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000365
Serhiy Storchaka214678e2016-11-28 10:52:05 +0200366>>> def g(*args, **kwargs):
367... print(args, sorted(kwargs.items()))
368>>> g(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
369... 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
370... 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
371... 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73,
372... 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
373... 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107,
374... 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,
375... 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135,
376... 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
377... 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163,
378... 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177,
379... 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
380... 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205,
381... 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219,
382... 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233,
383... 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247,
384... 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261,
385... 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275,
386... 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289,
387... 290, 291, 292, 293, 294, 295, 296, 297, 298, 299) # doctest: +ELLIPSIS
388(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ..., 297, 298, 299) []
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000389
Serhiy Storchaka214678e2016-11-28 10:52:05 +0200390>>> g(a000=0, a001=1, a002=2, a003=3, a004=4, a005=5, a006=6, a007=7, a008=8,
391... a009=9, a010=10, a011=11, a012=12, a013=13, a014=14, a015=15, a016=16,
392... a017=17, a018=18, a019=19, a020=20, a021=21, a022=22, a023=23, a024=24,
393... a025=25, a026=26, a027=27, a028=28, a029=29, a030=30, a031=31, a032=32,
394... a033=33, a034=34, a035=35, a036=36, a037=37, a038=38, a039=39, a040=40,
395... a041=41, a042=42, a043=43, a044=44, a045=45, a046=46, a047=47, a048=48,
396... a049=49, a050=50, a051=51, a052=52, a053=53, a054=54, a055=55, a056=56,
397... a057=57, a058=58, a059=59, a060=60, a061=61, a062=62, a063=63, a064=64,
398... a065=65, a066=66, a067=67, a068=68, a069=69, a070=70, a071=71, a072=72,
399... a073=73, a074=74, a075=75, a076=76, a077=77, a078=78, a079=79, a080=80,
400... a081=81, a082=82, a083=83, a084=84, a085=85, a086=86, a087=87, a088=88,
401... a089=89, a090=90, a091=91, a092=92, a093=93, a094=94, a095=95, a096=96,
402... a097=97, a098=98, a099=99, a100=100, a101=101, a102=102, a103=103,
403... a104=104, a105=105, a106=106, a107=107, a108=108, a109=109, a110=110,
404... a111=111, a112=112, a113=113, a114=114, a115=115, a116=116, a117=117,
405... a118=118, a119=119, a120=120, a121=121, a122=122, a123=123, a124=124,
406... a125=125, a126=126, a127=127, a128=128, a129=129, a130=130, a131=131,
407... a132=132, a133=133, a134=134, a135=135, a136=136, a137=137, a138=138,
408... a139=139, a140=140, a141=141, a142=142, a143=143, a144=144, a145=145,
409... a146=146, a147=147, a148=148, a149=149, a150=150, a151=151, a152=152,
410... a153=153, a154=154, a155=155, a156=156, a157=157, a158=158, a159=159,
411... a160=160, a161=161, a162=162, a163=163, a164=164, a165=165, a166=166,
412... a167=167, a168=168, a169=169, a170=170, a171=171, a172=172, a173=173,
413... a174=174, a175=175, a176=176, a177=177, a178=178, a179=179, a180=180,
414... a181=181, a182=182, a183=183, a184=184, a185=185, a186=186, a187=187,
415... a188=188, a189=189, a190=190, a191=191, a192=192, a193=193, a194=194,
416... a195=195, a196=196, a197=197, a198=198, a199=199, a200=200, a201=201,
417... a202=202, a203=203, a204=204, a205=205, a206=206, a207=207, a208=208,
418... a209=209, a210=210, a211=211, a212=212, a213=213, a214=214, a215=215,
419... a216=216, a217=217, a218=218, a219=219, a220=220, a221=221, a222=222,
420... a223=223, a224=224, a225=225, a226=226, a227=227, a228=228, a229=229,
421... a230=230, a231=231, a232=232, a233=233, a234=234, a235=235, a236=236,
422... a237=237, a238=238, a239=239, a240=240, a241=241, a242=242, a243=243,
423... a244=244, a245=245, a246=246, a247=247, a248=248, a249=249, a250=250,
424... a251=251, a252=252, a253=253, a254=254, a255=255, a256=256, a257=257,
425... a258=258, a259=259, a260=260, a261=261, a262=262, a263=263, a264=264,
426... a265=265, a266=266, a267=267, a268=268, a269=269, a270=270, a271=271,
427... a272=272, a273=273, a274=274, a275=275, a276=276, a277=277, a278=278,
428... a279=279, a280=280, a281=281, a282=282, a283=283, a284=284, a285=285,
429... a286=286, a287=287, a288=288, a289=289, a290=290, a291=291, a292=292,
430... a293=293, a294=294, a295=295, a296=296, a297=297, a298=298, a299=299)
431... # doctest: +ELLIPSIS
432() [('a000', 0), ('a001', 1), ('a002', 2), ..., ('a298', 298), ('a299', 299)]
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000433
Yury Selivanovf2392132016-12-13 19:03:51 -0500434>>> class C:
435... def meth(self, *args):
436... return args
437>>> obj = C()
438>>> obj.meth(
439... 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
440... 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
441... 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
442... 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73,
443... 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
444... 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107,
445... 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,
446... 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135,
447... 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
448... 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163,
449... 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177,
450... 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
451... 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205,
452... 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219,
453... 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233,
454... 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247,
455... 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261,
456... 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275,
457... 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289,
458... 290, 291, 292, 293, 294, 295, 296, 297, 298, 299) # doctest: +ELLIPSIS
459(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ..., 297, 298, 299)
460
Pablo Galindoc5fc1562020-04-22 23:29:27 +0100461# >>> f(lambda x: x[0] = 3)
462# Traceback (most recent call last):
463# SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000464
465The grammar accepts any test (basically, any expression) in the
466keyword slot of a call site. Test a few different options.
467
Pablo Galindoc5fc1562020-04-22 23:29:27 +0100468# >>> f(x()=2)
469# Traceback (most recent call last):
470# SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
471# >>> f(a or b=1)
472# Traceback (most recent call last):
473# SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
474# >>> f(x.y=1)
475# Traceback (most recent call last):
476# SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
477# >>> f((x)=2)
478# Traceback (most recent call last):
479# SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
480# >>> f(True=2)
481# Traceback (most recent call last):
Pablo Galindob86ed8e2021-04-12 16:59:30 +0100482# SyntaxError: cannot assign to True here. Maybe you meant '==' instead of '='?
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200483>>> f(__debug__=1)
484Traceback (most recent call last):
485SyntaxError: cannot assign to __debug__
Pablo Galindoc5fc1562020-04-22 23:29:27 +0100486>>> __debug__: int
487Traceback (most recent call last):
488SyntaxError: cannot assign to __debug__
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000489
490
Benjamin Peterson87c8d872009-06-11 22:54:11 +0000491More set_context():
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000492
493>>> (x for x in x) += 1
494Traceback (most recent call last):
Pablo Galindo16ab0702020-05-15 02:04:52 +0100495SyntaxError: 'generator expression' is an illegal expression for augmented assignment
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000496>>> None += 1
497Traceback (most recent call last):
Pablo Galindo16ab0702020-05-15 02:04:52 +0100498SyntaxError: 'None' is an illegal expression for augmented assignment
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200499>>> __debug__ += 1
500Traceback (most recent call last):
501SyntaxError: cannot assign to __debug__
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000502>>> f() += 1
503Traceback (most recent call last):
Pablo Galindo16ab0702020-05-15 02:04:52 +0100504SyntaxError: 'function call' is an illegal expression for augmented assignment
Thomas Wouters89f507f2006-12-13 04:49:30 +0000505
506
507Test continue in finally in weird combinations.
508
Ezio Melotti13925002011-03-16 11:05:33 +0200509continue in for loop under finally should be ok.
Thomas Wouters89f507f2006-12-13 04:49:30 +0000510
511 >>> def test():
512 ... try:
513 ... pass
514 ... finally:
515 ... for abc in range(10):
516 ... continue
Guido van Rossum7131f842007-02-09 20:13:25 +0000517 ... print(abc)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000518 >>> test()
519 9
520
Serhiy Storchakafe2bbb12018-03-18 09:56:52 +0200521continue in a finally should be ok.
Thomas Wouters89f507f2006-12-13 04:49:30 +0000522
523 >>> def test():
524 ... for abc in range(10):
525 ... try:
526 ... pass
527 ... finally:
528 ... continue
Serhiy Storchakafe2bbb12018-03-18 09:56:52 +0200529 ... print(abc)
530 >>> test()
531 9
Thomas Wouters89f507f2006-12-13 04:49:30 +0000532
533 >>> def test():
534 ... for abc in range(10):
535 ... try:
536 ... pass
537 ... finally:
538 ... try:
539 ... continue
540 ... except:
541 ... pass
Serhiy Storchakafe2bbb12018-03-18 09:56:52 +0200542 ... print(abc)
543 >>> test()
544 9
545
546 >>> def test():
547 ... for abc in range(10):
548 ... try:
549 ... pass
550 ... finally:
551 ... try:
552 ... pass
553 ... except:
554 ... continue
555 ... print(abc)
556 >>> test()
557 9
558
559A continue outside loop should not be allowed.
Thomas Wouters89f507f2006-12-13 04:49:30 +0000560
561 >>> def foo():
562 ... try:
563 ... pass
564 ... finally:
565 ... continue
566 Traceback (most recent call last):
567 ...
Serhiy Storchakafe2bbb12018-03-18 09:56:52 +0200568 SyntaxError: 'continue' not properly in loop
Thomas Wouters89f507f2006-12-13 04:49:30 +0000569
570There is one test for a break that is not in a loop. The compiler
571uses a single data structure to keep track of try-finally and loops,
572so we need to be sure that a break is actually inside a loop. If it
573isn't, there should be a syntax error.
574
575 >>> try:
Guido van Rossum7131f842007-02-09 20:13:25 +0000576 ... print(1)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000577 ... break
Guido van Rossum7131f842007-02-09 20:13:25 +0000578 ... print(2)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000579 ... finally:
Guido van Rossum7131f842007-02-09 20:13:25 +0000580 ... print(3)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000581 Traceback (most recent call last):
582 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000583 SyntaxError: 'break' outside loop
Thomas Wouters89f507f2006-12-13 04:49:30 +0000584
Benjamin Petersone09ed542016-07-14 22:00:03 -0700585This raises a SyntaxError, it used to raise a SystemError.
586Context for this change can be found on issue #27514
587
Thomas Wouters89f507f2006-12-13 04:49:30 +0000588In 2.5 there was a missing exception and an assert was triggered in a debug
589build. The number of blocks must be greater than CO_MAXBLOCKS. SF #1565514
590
591 >>> while 1:
592 ... while 2:
593 ... while 3:
594 ... while 4:
595 ... while 5:
596 ... while 6:
597 ... while 8:
598 ... while 9:
599 ... while 10:
600 ... while 11:
601 ... while 12:
602 ... while 13:
603 ... while 14:
604 ... while 15:
605 ... while 16:
606 ... while 17:
607 ... while 18:
608 ... while 19:
609 ... while 20:
610 ... while 21:
611 ... while 22:
612 ... break
613 Traceback (most recent call last):
614 ...
Benjamin Petersone09ed542016-07-14 22:00:03 -0700615 SyntaxError: too many statically nested blocks
Thomas Wouters89f507f2006-12-13 04:49:30 +0000616
Guido van Rossum6cff8742016-09-09 09:36:26 -0700617Misuse of the nonlocal and global statement can lead to a few unique syntax errors.
618
619 >>> def f():
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200620 ... print(x)
621 ... global x
622 Traceback (most recent call last):
623 ...
624 SyntaxError: name 'x' is used prior to global declaration
625
626 >>> def f():
Guido van Rossum6cff8742016-09-09 09:36:26 -0700627 ... x = 1
628 ... global x
629 Traceback (most recent call last):
630 ...
631 SyntaxError: name 'x' is assigned to before global declaration
632
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +0200633 >>> def f(x):
634 ... global x
635 Traceback (most recent call last):
636 ...
637 SyntaxError: name 'x' is parameter and global
638
Guido van Rossum6cff8742016-09-09 09:36:26 -0700639 >>> def f():
640 ... x = 1
641 ... def g():
642 ... print(x)
643 ... nonlocal x
644 Traceback (most recent call last):
645 ...
646 SyntaxError: name 'x' is used prior to nonlocal declaration
Jeremy Hylton81e95022007-02-27 06:50:52 +0000647
Serhiy Storchaka3b66ebe2017-10-24 00:27:14 +0300648 >>> def f():
649 ... x = 1
650 ... def g():
651 ... x = 2
652 ... nonlocal x
653 Traceback (most recent call last):
654 ...
655 SyntaxError: name 'x' is assigned to before nonlocal declaration
656
Jeremy Hylton81e95022007-02-27 06:50:52 +0000657 >>> def f(x):
658 ... nonlocal x
659 Traceback (most recent call last):
660 ...
Nick Coghlan650f0d02007-04-15 12:05:43 +0000661 SyntaxError: name 'x' is parameter and nonlocal
Guido van Rossumd8faa362007-04-27 19:54:29 +0000662
Jeremy Hylton81e95022007-02-27 06:50:52 +0000663 >>> def f():
664 ... global x
665 ... nonlocal x
666 Traceback (most recent call last):
667 ...
668 SyntaxError: name 'x' is nonlocal and global
669
670 >>> def f():
671 ... nonlocal x
672 Traceback (most recent call last):
673 ...
674 SyntaxError: no binding for nonlocal 'x' found
675
Nick Coghlan4138bfe2007-04-23 10:14:27 +0000676From SF bug #1705365
677 >>> nonlocal x
678 Traceback (most recent call last):
679 ...
680 SyntaxError: nonlocal declaration not allowed at module level
681
Serhiy Storchaka3b66ebe2017-10-24 00:27:14 +0300682From https://bugs.python.org/issue25973
Benjamin Peterson3cc8f4b2015-12-29 10:08:34 -0600683 >>> class A:
684 ... def f(self):
685 ... nonlocal __x
686 Traceback (most recent call last):
687 ...
688 SyntaxError: no binding for nonlocal '_A__x' found
689
Guido van Rossumd8faa362007-04-27 19:54:29 +0000690
691This tests assignment-context; there was a bug in Python 2.5 where compiling
692a complex 'if' (one with 'elif') would fail to notice an invalid suite,
693leading to spurious errors.
694
695 >>> if 1:
696 ... x() = 1
697 ... elif 1:
698 ... pass
699 Traceback (most recent call last):
700 ...
Pablo Galindob86ed8e2021-04-12 16:59:30 +0100701 SyntaxError: cannot assign to function call here. Maybe you meant '==' instead of '='?
Guido van Rossumd8faa362007-04-27 19:54:29 +0000702
703 >>> if 1:
704 ... pass
705 ... elif 1:
706 ... x() = 1
707 Traceback (most recent call last):
708 ...
Pablo Galindob86ed8e2021-04-12 16:59:30 +0100709 SyntaxError: cannot assign to function call here. Maybe you meant '==' instead of '='?
Guido van Rossumd8faa362007-04-27 19:54:29 +0000710
711 >>> if 1:
712 ... x() = 1
713 ... elif 1:
714 ... pass
715 ... else:
716 ... pass
717 Traceback (most recent call last):
718 ...
Pablo Galindob86ed8e2021-04-12 16:59:30 +0100719 SyntaxError: cannot assign to function call here. Maybe you meant '==' instead of '='?
Guido van Rossumd8faa362007-04-27 19:54:29 +0000720
721 >>> if 1:
722 ... pass
723 ... elif 1:
724 ... x() = 1
725 ... else:
726 ... pass
727 Traceback (most recent call last):
728 ...
Pablo Galindob86ed8e2021-04-12 16:59:30 +0100729 SyntaxError: cannot assign to function call here. Maybe you meant '==' instead of '='?
Guido van Rossumd8faa362007-04-27 19:54:29 +0000730
731 >>> if 1:
732 ... pass
733 ... elif 1:
734 ... pass
735 ... else:
736 ... x() = 1
737 Traceback (most recent call last):
738 ...
Pablo Galindob86ed8e2021-04-12 16:59:30 +0100739 SyntaxError: cannot assign to function call here. Maybe you meant '==' instead of '='?
Jeremy Hylton81e95022007-02-27 06:50:52 +0000740
Pablo Galindo58fb1562021-02-02 19:54:22 +0000741 Missing ':' before suites:
742
743 >>> def f()
744 ... pass
745 Traceback (most recent call last):
746 SyntaxError: expected ':'
747
748 >>> class A
749 ... pass
750 Traceback (most recent call last):
751 SyntaxError: expected ':'
752
753 >>> if 1
754 ... pass
755 ... elif 1:
756 ... pass
757 ... else:
758 ... x() = 1
759 Traceback (most recent call last):
760 SyntaxError: expected ':'
761
762 >>> if 1:
763 ... pass
764 ... elif 1
765 ... pass
766 ... else:
767 ... x() = 1
768 Traceback (most recent call last):
769 SyntaxError: expected ':'
770
771 >>> if 1:
772 ... pass
773 ... elif 1:
774 ... pass
775 ... else
776 ... x() = 1
777 Traceback (most recent call last):
778 SyntaxError: expected ':'
779
780 >>> for x in range(10)
781 ... pass
782 Traceback (most recent call last):
783 SyntaxError: expected ':'
784
785 >>> while True
786 ... pass
787 Traceback (most recent call last):
788 SyntaxError: expected ':'
789
790 >>> with blech as something
791 ... pass
792 Traceback (most recent call last):
793 SyntaxError: expected ':'
794
795 >>> with blech
796 ... pass
797 Traceback (most recent call last):
798 SyntaxError: expected ':'
799
800 >>> with blech, block as something
801 ... pass
802 Traceback (most recent call last):
803 SyntaxError: expected ':'
804
805 >>> with blech, block as something, bluch
806 ... pass
807 Traceback (most recent call last):
808 SyntaxError: expected ':'
809
810 >>> with (blech as something)
811 ... pass
812 Traceback (most recent call last):
813 SyntaxError: expected ':'
814
815 >>> with (blech)
816 ... pass
817 Traceback (most recent call last):
818 SyntaxError: expected ':'
819
820 >>> with (blech, block as something)
821 ... pass
822 Traceback (most recent call last):
823 SyntaxError: expected ':'
824
825 >>> with (blech, block as something, bluch)
826 ... pass
827 Traceback (most recent call last):
828 SyntaxError: expected ':'
829
830 >>> try
831 ... pass
832 Traceback (most recent call last):
833 SyntaxError: expected ':'
834
835 >>> try:
836 ... pass
837 ... except
838 ... pass
839 Traceback (most recent call last):
840 SyntaxError: expected ':'
841
Pablo Galindo08fb8ac2021-03-18 01:03:11 +0000842 >>> match x
843 ... case list():
844 ... pass
845 Traceback (most recent call last):
846 SyntaxError: expected ':'
847
848 >>> match x:
849 ... case list()
850 ... pass
851 Traceback (most recent call last):
852 SyntaxError: expected ':'
853
854 >>> match x:
855 ... case [y] if y > 0
856 ... pass
857 Traceback (most recent call last):
858 SyntaxError: expected ':'
859
Pablo Galindob86ed8e2021-04-12 16:59:30 +0100860 >>> if x = 3:
861 ... pass
862 Traceback (most recent call last):
863 SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?
864
865 >>> while x = 3:
866 ... pass
867 Traceback (most recent call last):
868 SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?
869
870 >>> if x.a = 3:
871 ... pass
872 Traceback (most recent call last):
873 SyntaxError: cannot assign to attribute here. Maybe you meant '==' instead of '='?
874
875 >>> while x.a = 3:
876 ... pass
877 Traceback (most recent call last):
878 SyntaxError: cannot assign to attribute here. Maybe you meant '==' instead of '='?
879
Pablo Galindod9151cb2021-04-13 02:32:33 +0100880Ensure that early = are not matched by the parser as invalid comparisons
Pablo Galindob2802482021-04-15 21:38:45 +0100881 >>> f(2, 4, x=34); 1 $ 2
Pablo Galindod9151cb2021-04-13 02:32:33 +0100882 Traceback (most recent call last):
883 SyntaxError: invalid syntax
884
Pablo Galindo30ed93b2021-04-13 17:51:21 +0100885 >>> dict(x=34); x $ y
886 Traceback (most recent call last):
887 SyntaxError: invalid syntax
888
889 >>> dict(x=34, (x for x in range 10), 1); x $ y
890 Traceback (most recent call last):
891 SyntaxError: invalid syntax
892
893 >>> dict(x=34, x=1, y=2); x $ y
894 Traceback (most recent call last):
895 SyntaxError: invalid syntax
896
Pablo Galindoda743502021-04-15 14:06:39 +0100897Incomplete dictionary literals
898
899 >>> {1:2, 3:4, 5}
900 Traceback (most recent call last):
901 SyntaxError: ':' expected after dictionary key
902
903 >>> {1:2, 3:4, 5:}
904 Traceback (most recent call last):
905 SyntaxError: expression expected after dictionary key and ':'
906
907 >>> {1: *12+1, 23: 1}
908 Traceback (most recent call last):
909 SyntaxError: cannot use a starred expression in a dictionary value
910
911 >>> {1: *12+1}
912 Traceback (most recent call last):
913 SyntaxError: cannot use a starred expression in a dictionary value
914
915 >>> {1: 23, 1: *12+1}
916 Traceback (most recent call last):
917 SyntaxError: cannot use a starred expression in a dictionary value
918
919 >>> {1:}
920 Traceback (most recent call last):
921 SyntaxError: expression expected after dictionary key and ':'
922
923 # Ensure that the error is not raise for syntax errors that happen after sets
924
925 >>> {1} $
926 Traceback (most recent call last):
927 SyntaxError: invalid syntax
928
Collin Winter828f04a2007-08-31 00:04:24 +0000929Make sure that the old "raise X, Y[, Z]" form is gone:
930 >>> raise X, Y
931 Traceback (most recent call last):
932 ...
933 SyntaxError: invalid syntax
934 >>> raise X, Y, Z
935 Traceback (most recent call last):
936 ...
937 SyntaxError: invalid syntax
938
Pablo Galindo206cbda2021-02-07 18:42:21 +0000939Check that an exception group with missing parentheses
940raise a custom exception
941
942 >>> try:
943 ... pass
944 ... except A, B:
945 ... pass
946 Traceback (most recent call last):
947 SyntaxError: exception group must be parenthesized
948
949 >>> try:
950 ... pass
951 ... except A, B, C:
952 ... pass
953 Traceback (most recent call last):
954 SyntaxError: exception group must be parenthesized
955
956 >>> try:
957 ... pass
958 ... except A, B, C as blech:
959 ... pass
960 Traceback (most recent call last):
961 SyntaxError: exception group must be parenthesized
962
963 >>> try:
964 ... pass
965 ... except A, B, C as blech:
966 ... pass
967 ... finally:
968 ... pass
969 Traceback (most recent call last):
970 SyntaxError: exception group must be parenthesized
971
Benjamin Peterson07a1f942008-07-01 20:03:27 +0000972
973>>> f(a=23, a=234)
974Traceback (most recent call last):
975 ...
Pablo Galindo254ec782020-04-03 20:37:13 +0100976SyntaxError: keyword argument repeated: a
Benjamin Peterson07a1f942008-07-01 20:03:27 +0000977
Benjamin Peterson1b1a1a42010-06-24 00:17:03 +0000978>>> {1, 2, 3} = 42
979Traceback (most recent call last):
Pablo Galindob86ed8e2021-04-12 16:59:30 +0100980SyntaxError: cannot assign to set display here. Maybe you meant '==' instead of '='?
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200981
982>>> {1: 2, 3: 4} = 42
983Traceback (most recent call last):
Pablo Galindob86ed8e2021-04-12 16:59:30 +0100984SyntaxError: cannot assign to dict literal here. Maybe you meant '==' instead of '='?
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200985
986>>> f'{x}' = 42
987Traceback (most recent call last):
Pablo Galindob86ed8e2021-04-12 16:59:30 +0100988SyntaxError: cannot assign to f-string expression here. Maybe you meant '==' instead of '='?
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +0200989
990>>> f'{x}-{y}' = 42
991Traceback (most recent call last):
Pablo Galindob86ed8e2021-04-12 16:59:30 +0100992SyntaxError: cannot assign to f-string expression here. Maybe you meant '==' instead of '='?
Benjamin Peterson1b1a1a42010-06-24 00:17:03 +0000993
Batuhan Taskaya72e0aa22020-05-21 23:41:58 +0300994>>> from t import x,
995Traceback (most recent call last):
996SyntaxError: trailing comma not allowed without surrounding parentheses
997
998>>> from t import x,y,
999Traceback (most recent call last):
1000SyntaxError: trailing comma not allowed without surrounding parentheses
1001
Batuhan Taskayac8f29ad2020-06-27 21:33:08 +03001002>>> (): int
1003Traceback (most recent call last):
1004SyntaxError: only single target (not tuple) can be annotated
1005>>> []: int
1006Traceback (most recent call last):
1007SyntaxError: only single target (not list) can be annotated
1008>>> (()): int
1009Traceback (most recent call last):
1010SyntaxError: only single target (not tuple) can be annotated
1011>>> ([]): int
1012Traceback (most recent call last):
1013SyntaxError: only single target (not list) can be annotated
1014
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001015Corner-cases that used to fail to raise the correct error:
1016
1017 >>> def f(*, x=lambda __debug__:0): pass
1018 Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +02001019 SyntaxError: cannot assign to __debug__
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001020
Pablo Galindob0544ba2021-04-21 12:41:19 +01001021 >>> def f(*args:(lambda __debug__:0)): pass
1022 Traceback (most recent call last):
1023 SyntaxError: cannot assign to __debug__
1024
1025 >>> def f(**kwargs:(lambda __debug__:0)): pass
1026 Traceback (most recent call last):
1027 SyntaxError: cannot assign to __debug__
1028
Lysandros Nikolaoue10e7c72020-05-04 13:58:31 +03001029 >>> with (lambda *:0): pass
1030 Traceback (most recent call last):
1031 SyntaxError: named arguments must follow bare *
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001032
1033Corner-cases that used to crash:
1034
1035 >>> def f(**__debug__): pass
1036 Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +02001037 SyntaxError: cannot assign to __debug__
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001038
1039 >>> def f(*xx, __debug__): pass
1040 Traceback (most recent call last):
Serhiy Storchaka97f1efb2018-11-20 19:27:16 +02001041 SyntaxError: cannot assign to __debug__
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001042
Lysandros Nikolaou7b7a21b2020-05-18 20:32:03 +03001043 >>> import ä £
1044 Traceback (most recent call last):
1045 SyntaxError: invalid character '£' (U+00A3)
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001046"""
1047
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00001048import re
1049import unittest
1050
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001051from test import support
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00001052
1053class SyntaxTestCase(unittest.TestCase):
1054
1055 def _check_error(self, code, errtext,
Serhiy Storchaka8b583392016-12-11 14:39:01 +02001056 filename="<testcase>", mode="exec", subclass=None, lineno=None, offset=None):
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00001057 """Check that compiling code raises SyntaxError with errtext.
1058
1059 errtest is a regular expression that must be present in the
Thomas Wouters477c8d52006-05-27 19:21:47 +00001060 test of the exception raised. If subclass is specified it
1061 is the expected subclass of SyntaxError (e.g. IndentationError).
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00001062 """
1063 try:
1064 compile(code, filename, mode)
Guido van Rossumb940e112007-01-10 16:19:56 +00001065 except SyntaxError as err:
Thomas Wouters477c8d52006-05-27 19:21:47 +00001066 if subclass and not isinstance(err, subclass):
1067 self.fail("SyntaxError is not a %s" % subclass.__name__)
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00001068 mo = re.search(errtext, str(err))
1069 if mo is None:
Shantanu27c0d9b2020-05-11 14:53:58 -07001070 self.fail("SyntaxError did not contain %r" % (errtext,))
Serhiy Storchaka8b583392016-12-11 14:39:01 +02001071 self.assertEqual(err.filename, filename)
1072 if lineno is not None:
1073 self.assertEqual(err.lineno, lineno)
1074 if offset is not None:
1075 self.assertEqual(err.offset, offset)
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00001076 else:
1077 self.fail("compile() did not raise SyntaxError")
1078
Pablo Galindo43c4fb62020-12-13 16:46:48 +00001079 def test_expression_with_assignment(self):
1080 self._check_error(
1081 "print(end1 + end2 = ' ')",
Pablo Galindo30ed93b2021-04-13 17:51:21 +01001082 'expression cannot contain assignment, perhaps you meant "=="?',
Pablo Galindo43c4fb62020-12-13 16:46:48 +00001083 offset=19
1084 )
1085
Lysandros Nikolaou15acc4e2020-10-27 20:54:20 +02001086 def test_curly_brace_after_primary_raises_immediately(self):
1087 self._check_error("f{", "invalid syntax", mode="single")
1088
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00001089 def test_assign_call(self):
1090 self._check_error("f() = 1", "assign")
1091
1092 def test_assign_del(self):
Shantanu27c0d9b2020-05-11 14:53:58 -07001093 self._check_error("del (,)", "invalid syntax")
Pablo Galindob86ed8e2021-04-12 16:59:30 +01001094 self._check_error("del 1", "cannot delete literal")
1095 self._check_error("del (1, 2)", "cannot delete literal")
1096 self._check_error("del None", "cannot delete None")
1097 self._check_error("del *x", "cannot delete starred")
1098 self._check_error("del (*x)", "cannot use starred expression")
1099 self._check_error("del (*x,)", "cannot delete starred")
1100 self._check_error("del [*x,]", "cannot delete starred")
1101 self._check_error("del f()", "cannot delete function call")
1102 self._check_error("del f(a, b)", "cannot delete function call")
1103 self._check_error("del o.f()", "cannot delete function call")
1104 self._check_error("del a[0]()", "cannot delete function call")
1105 self._check_error("del x, f()", "cannot delete function call")
1106 self._check_error("del f(), x", "cannot delete function call")
1107 self._check_error("del [a, b, ((c), (d,), e.f())]", "cannot delete function call")
1108 self._check_error("del (a if True else b)", "cannot delete conditional")
1109 self._check_error("del +a", "cannot delete expression")
1110 self._check_error("del a, +b", "cannot delete expression")
1111 self._check_error("del a + b", "cannot delete expression")
1112 self._check_error("del (a + b, c)", "cannot delete expression")
1113 self._check_error("del (c[0], a + b)", "cannot delete expression")
1114 self._check_error("del a.b.c + 2", "cannot delete expression")
1115 self._check_error("del a.b.c[0] + 2", "cannot delete expression")
1116 self._check_error("del (a, b, (c, d.e.f + 2))", "cannot delete expression")
1117 self._check_error("del [a, b, (c, d.e.f[0] + 2)]", "cannot delete expression")
1118 self._check_error("del (a := 5)", "cannot delete named expression")
Shantanu27c0d9b2020-05-11 14:53:58 -07001119 # We don't have a special message for this, but make sure we don't
1120 # report "cannot delete name"
1121 self._check_error("del a += b", "invalid syntax")
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00001122
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +02001123 def test_global_param_err_first(self):
Amaury Forgeot d'Arcfe7b4052010-09-10 19:47:43 +00001124 source = """if 1:
1125 def error(a):
1126 global a # SyntaxError
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +02001127 def error2():
Amaury Forgeot d'Arcfe7b4052010-09-10 19:47:43 +00001128 b = 1
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +02001129 global b # SyntaxError
Amaury Forgeot d'Arcfe7b4052010-09-10 19:47:43 +00001130 """
Ivan Levkivskyi8c83c232017-10-26 23:28:35 +02001131 self._check_error(source, "parameter and global", lineno=3)
1132
1133 def test_nonlocal_param_err_first(self):
1134 source = """if 1:
1135 def error(a):
1136 nonlocal a # SyntaxError
1137 def error2():
1138 b = 1
1139 global b # SyntaxError
1140 """
1141 self._check_error(source, "parameter and nonlocal", lineno=3)
Jeremy Hylton42d90162003-07-15 20:24:27 +00001142
Neal Norwitzfcf44352005-11-27 20:37:43 +00001143 def test_break_outside_loop(self):
1144 self._check_error("break", "outside loop")
1145
Pablo Galindoaf8646c2019-05-17 11:37:08 +01001146 def test_yield_outside_function(self):
Pablo Galindo18c5f9d2019-07-15 10:15:01 +01001147 self._check_error("if 0: yield", "outside function")
1148 self._check_error("if 0: yield\nelse: x=1", "outside function")
1149 self._check_error("if 1: pass\nelse: yield", "outside function")
1150 self._check_error("while 0: yield", "outside function")
1151 self._check_error("while 0: yield\nelse: x=1", "outside function")
1152 self._check_error("class C:\n if 0: yield", "outside function")
1153 self._check_error("class C:\n if 1: pass\n else: yield",
1154 "outside function")
1155 self._check_error("class C:\n while 0: yield", "outside function")
1156 self._check_error("class C:\n while 0: yield\n else: x = 1",
1157 "outside function")
Pablo Galindoaf8646c2019-05-17 11:37:08 +01001158
1159 def test_return_outside_function(self):
Pablo Galindo18c5f9d2019-07-15 10:15:01 +01001160 self._check_error("if 0: return", "outside function")
1161 self._check_error("if 0: return\nelse: x=1", "outside function")
1162 self._check_error("if 1: pass\nelse: return", "outside function")
1163 self._check_error("while 0: return", "outside function")
1164 self._check_error("class C:\n if 0: return", "outside function")
1165 self._check_error("class C:\n while 0: return", "outside function")
1166 self._check_error("class C:\n while 0: return\n else: x=1",
1167 "outside function")
1168 self._check_error("class C:\n if 0: return\n else: x= 1",
1169 "outside function")
1170 self._check_error("class C:\n if 1: pass\n else: return",
1171 "outside function")
Pablo Galindoaf8646c2019-05-17 11:37:08 +01001172
1173 def test_break_outside_loop(self):
Pablo Galindo18c5f9d2019-07-15 10:15:01 +01001174 self._check_error("if 0: break", "outside loop")
1175 self._check_error("if 0: break\nelse: x=1", "outside loop")
1176 self._check_error("if 1: pass\nelse: break", "outside loop")
1177 self._check_error("class C:\n if 0: break", "outside loop")
1178 self._check_error("class C:\n if 1: pass\n else: break",
1179 "outside loop")
Pablo Galindoaf8646c2019-05-17 11:37:08 +01001180
1181 def test_continue_outside_loop(self):
Pablo Galindo18c5f9d2019-07-15 10:15:01 +01001182 self._check_error("if 0: continue", "not properly in loop")
1183 self._check_error("if 0: continue\nelse: x=1", "not properly in loop")
1184 self._check_error("if 1: pass\nelse: continue", "not properly in loop")
1185 self._check_error("class C:\n if 0: continue", "not properly in loop")
1186 self._check_error("class C:\n if 1: pass\n else: continue",
1187 "not properly in loop")
Pablo Galindoaf8646c2019-05-17 11:37:08 +01001188
Thomas Wouters477c8d52006-05-27 19:21:47 +00001189 def test_unexpected_indent(self):
1190 self._check_error("foo()\n bar()\n", "unexpected indent",
1191 subclass=IndentationError)
1192
1193 def test_no_indent(self):
1194 self._check_error("if 1:\nfoo()", "expected an indented block",
1195 subclass=IndentationError)
1196
1197 def test_bad_outdent(self):
1198 self._check_error("if 1:\n foo()\n bar()",
1199 "unindent does not match .* level",
1200 subclass=IndentationError)
1201
1202 def test_kwargs_last(self):
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001203 self._check_error("int(base=10, '2')",
1204 "positional argument follows keyword argument")
1205
1206 def test_kwargs_last2(self):
Serhiy Storchaka0cc99c82018-01-04 10:36:35 +02001207 self._check_error("int(**{'base': 10}, '2')",
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001208 "positional argument follows "
1209 "keyword argument unpacking")
1210
1211 def test_kwargs_last3(self):
Serhiy Storchaka0cc99c82018-01-04 10:36:35 +02001212 self._check_error("int(**{'base': 10}, *['2'])",
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001213 "iterable argument unpacking follows "
1214 "keyword argument unpacking")
Thomas Wouters477c8d52006-05-27 19:21:47 +00001215
Lysandros Nikolaou896f4cf2020-06-11 02:56:08 +03001216 def test_empty_line_after_linecont(self):
1217 # See issue-40847
1218 s = r"""\
1219pass
1220 \
1221
1222pass
1223"""
1224 try:
1225 compile(s, '<string>', 'exec')
1226 except SyntaxError:
1227 self.fail("Empty line after a line continuation character is valid.")
1228
Mark Shannon02d126a2020-09-25 14:04:19 +01001229 @support.cpython_only
1230 def test_nested_named_except_blocks(self):
1231 code = ""
1232 for i in range(12):
1233 code += f"{' '*i}try:\n"
1234 code += f"{' '*(i+1)}raise Exception\n"
1235 code += f"{' '*i}except Exception as e:\n"
1236 code += f"{' '*4*12}pass"
1237 self._check_error(code, "too many statically nested blocks")
Lysandros Nikolaou896f4cf2020-06-11 02:56:08 +03001238
Pablo Galindo06f8c332020-10-30 23:48:42 +00001239 def test_barry_as_flufl_with_syntax_errors(self):
1240 # The "barry_as_flufl" rule can produce some "bugs-at-a-distance" if
1241 # is reading the wrong token in the presence of syntax errors later
1242 # in the file. See bpo-42214 for more information.
1243 code = """
1244def func1():
1245 if a != b:
1246 raise ValueError
1247
1248def func2():
1249 try
1250 return 1
1251 finally:
1252 pass
1253"""
Pablo Galindo58fb1562021-02-02 19:54:22 +00001254 self._check_error(code, "expected ':'")
Pablo Galindo06f8c332020-10-30 23:48:42 +00001255
Pablo Galindo96eeff52021-03-22 17:28:11 +00001256 def test_invalid_line_continuation_error_position(self):
1257 self._check_error(r"a = 3 \ 4",
1258 "unexpected character after line continuation character",
1259 lineno=1, offset=9)
1260
Lysandros Nikolaou02cdfc92020-10-31 20:31:41 +02001261 def test_invalid_line_continuation_left_recursive(self):
1262 # Check bpo-42218: SyntaxErrors following left-recursive rules
1263 # (t_primary_raw in this case) need to be tested explicitly
1264 self._check_error("A.\u018a\\ ",
1265 "unexpected character after line continuation character")
1266 self._check_error("A.\u03bc\\\n",
1267 "unexpected EOF while parsing")
1268
Pablo Galindod6d63712021-01-19 23:59:33 +00001269 def test_error_parenthesis(self):
1270 for paren in "([{":
1271 self._check_error(paren + "1 + 2", f"\\{paren}' was never closed")
1272
1273 for paren in ")]}":
1274 self._check_error(paren + "1 + 2", f"unmatched '\\{paren}'")
1275
Pablo Galindo08fb8ac2021-03-18 01:03:11 +00001276 def test_match_call_does_not_raise_syntax_error(self):
1277 code = """
1278def match(x):
1279 return 1+1
1280
1281match(34)
1282"""
1283 compile(code, "<string>", "exec")
1284
1285 def test_case_call_does_not_raise_syntax_error(self):
1286 code = """
1287def case(x):
1288 return 1+1
1289
1290case(34)
1291"""
1292 compile(code, "<string>", "exec")
1293
Pablo Galindod6d63712021-01-19 23:59:33 +00001294
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00001295def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001296 support.run_unittest(SyntaxTestCase)
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001297 from test import test_syntax
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001298 support.run_doctest(test_syntax, verbosity=True)
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00001299
1300if __name__ == "__main__":
1301 test_main()