1 """This module tests SyntaxErrors. 2 3 Here's an example of the sort of thing that is tested. 4 5 >>> def f(x): 6 ... global x 7 Traceback (most recent call last): 8 SyntaxError: name 'x' is local and global (<doctest test.test_syntax[0]>, line 1) 9 10 The tests are all raise SyntaxErrors. They were created by checking 11 each C call that raises SyntaxError. There are several modules that 12 raise these exceptions-- ast.c, compile.c, future.c, pythonrun.c, and 13 symtable.c. 14 15 The parser itself outlaws a lot of invalid syntax. None of these 16 errors are tested here at the moment. We should add some tests; since 17 there are infinitely many programs with invalid syntax, we would need 18 to be judicious in selecting some. 19 20 The compiler generates a synthetic module name for code executed by 21 doctest. 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 23 order of tests in this module means renumbering all the errors after 24 it. (Maybe we should enable the ellipsis option for these tests.) 25 26 In ast.c, syntax errors are raised by calling ast_error(). 27 28 Errors from set_context(): 29 30 >>> obj.None = 1 31 Traceback (most recent call last): 32 File "<doctest test.test_syntax[1]>", line 1 33 SyntaxError: cannot assign to None 34 35 >>> None = 1 36 Traceback (most recent call last): 37 File "<doctest test.test_syntax[2]>", line 1 38 SyntaxError: cannot assign to None 39 40 It's a syntax error to assign to the empty tuple. Why isn't it an 41 error to assign to the empty list? It will always raise some error at 42 runtime. 43 44 >>> () = 1 45 Traceback (most recent call last): 46 File "<doctest test.test_syntax[3]>", line 1 47 SyntaxError: can't assign to () 48 49 >>> f() = 1 50 Traceback (most recent call last): 51 File "<doctest test.test_syntax[4]>", line 1 52 SyntaxError: can't assign to function call 53 54 >>> del f() 55 Traceback (most recent call last): 56 File "<doctest test.test_syntax[5]>", line 1 57 SyntaxError: can't delete function call 58 59 >>> a + 1 = 2 60 Traceback (most recent call last): 61 File "<doctest test.test_syntax[6]>", line 1 62 SyntaxError: can't assign to operator 63 64 >>> (x for x in x) = 1 65 Traceback (most recent call last): 66 File "<doctest test.test_syntax[7]>", line 1 67 SyntaxError: can't assign to generator expression 68 69 >>> 1 = 1 70 Traceback (most recent call last): 71 File "<doctest test.test_syntax[8]>", line 1 72 SyntaxError: can't assign to literal 73 74 >>> "abc" = 1 75 Traceback (most recent call last): 76 File "<doctest test.test_syntax[9]>", line 1 77 SyntaxError: can't assign to literal 78 79 >>> b"" = 1 80 Traceback (most recent call last): 81 SyntaxError: can't assign to literal 82 83 If the left-hand side of an assignment is a list or tuple, an illegal 84 expression inside that contain should still cause a syntax error. 85 This test just checks a couple of cases rather than enumerating all of 86 them. 87 88 >>> (a, "b", c) = (1, 2, 3) 89 Traceback (most recent call last): 90 File "<doctest test.test_syntax[11]>", line 1 91 SyntaxError: can't assign to literal 92 93 >>> [a, b, c + 1] = [1, 2, 3] 94 Traceback (most recent call last): 95 File "<doctest test.test_syntax[12]>", line 1 96 SyntaxError: can't assign to operator 97 98 >>> a if 1 else b = 1 99 Traceback (most recent call last): 100 File "<doctest test.test_syntax[13]>", line 1 101 SyntaxError: can't assign to conditional expression 102 103 From compiler_complex_args(): 104 105 >>> def f(None=1): 106 ... pass 107 Traceback (most recent call last): 108 File "<doctest test.test_syntax[14]>", line 1 109 SyntaxError: cannot assign to None 110 111 112 From ast_for_arguments(): 113 114 >>> def f(x, y=1, z): 115 ... pass 116 Traceback (most recent call last): 117 File "<doctest test.test_syntax[15]>", line 1 118 SyntaxError: non-default argument follows default argument 119 120 >>> def f(x, None): 121 ... pass 122 Traceback (most recent call last): 123 File "<doctest test.test_syntax[16]>", line 1 124 SyntaxError: cannot assign to None 125 126 >>> def f(*None): 127 ... pass 128 Traceback (most recent call last): 129 File "<doctest test.test_syntax[17]>", line 1 130 SyntaxError: cannot assign to None 131 132 >>> def f(**None): 133 ... pass 134 Traceback (most recent call last): 135 File "<doctest test.test_syntax[18]>", line 1 136 SyntaxError: cannot assign to None 137 138 139 From ast_for_funcdef(): 140 141 >>> def None(x): 142 ... pass 143 Traceback (most recent call last): 144 File "<doctest test.test_syntax[19]>", line 1 145 SyntaxError: cannot assign to None 146 147 148 From ast_for_call(): 149 150 >>> def f(it, *varargs, **kwargs): 151 ... return list(it) 152 >>> L = range(10) 153 >>> f(x for x in L) 154 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 155 >>> f(x for x in L, 1) 156 Traceback (most recent call last): 157 File "<doctest test.test_syntax[23]>", line 1 158 SyntaxError: Generator expression must be parenthesized if not sole argument 159 >>> f(x for x in L, y=1) 160 Traceback (most recent call last): 161 SyntaxError: Generator expression must be parenthesized if not sole argument 162 >>> f(L, x for x in L) 163 Traceback (most recent call last): 164 SyntaxError: Generator expression must be parenthesized if not sole argument 165 >>> f(x for x in L, y for y in L) 166 Traceback (most recent call last): 167 SyntaxError: Generator expression must be parenthesized if not sole argument 168 >>> f(x for x in L,) 169 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 170 >>> f((x for x in L), 1) 171 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 172 173 >>> def g(*args, **kwargs): 174 ... print args, sorted(kwargs.items()) 175 >>> g(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 176 ... 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 177 ... 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 178 ... 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 179 ... 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 180 ... 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 181 ... 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 182 ... 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 183 ... 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 184 ... 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 185 ... 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 186 ... 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 187 ... 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 188 ... 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 189 ... 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 190 ... 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 191 ... 248, 249, 250, 251, 252, 253, 254) # doctest: +ELLIPSIS 192 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ..., 252, 253, 254) [] 193 >>> g(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 194 ... 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 195 ... 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 196 ... 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 197 ... 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 198 ... 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 199 ... 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 200 ... 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 201 ... 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 202 ... 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 203 ... 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 204 ... 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 205 ... 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206 ... 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 207 ... 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 208 ... 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 209 ... 248, 249, 250, 251, 252, 253, 254, 255) 210 Traceback (most recent call last): 211 File "<doctest test.test_syntax[25]>", line 1 212 SyntaxError: more than 255 arguments 213 214 >>> g(a000=0, a001=1, a002=2, a003=3, a004=4, a005=5, a006=6, a007=7, a008=8, 215 ... a009=9, a010=10, a011=11, a012=12, a013=13, a014=14, a015=15, a016=16, 216 ... a017=17, a018=18, a019=19, a020=20, a021=21, a022=22, a023=23, a024=24, 217 ... a025=25, a026=26, a027=27, a028=28, a029=29, a030=30, a031=31, a032=32, 218 ... a033=33, a034=34, a035=35, a036=36, a037=37, a038=38, a039=39, a040=40, 219 ... a041=41, a042=42, a043=43, a044=44, a045=45, a046=46, a047=47, a048=48, 220 ... a049=49, a050=50, a051=51, a052=52, a053=53, a054=54, a055=55, a056=56, 221 ... a057=57, a058=58, a059=59, a060=60, a061=61, a062=62, a063=63, a064=64, 222 ... a065=65, a066=66, a067=67, a068=68, a069=69, a070=70, a071=71, a072=72, 223 ... a073=73, a074=74, a075=75, a076=76, a077=77, a078=78, a079=79, a080=80, 224 ... a081=81, a082=82, a083=83, a084=84, a085=85, a086=86, a087=87, a088=88, 225 ... a089=89, a090=90, a091=91, a092=92, a093=93, a094=94, a095=95, a096=96, 226 ... a097=97, a098=98, a099=99, a100=100, a101=101, a102=102, a103=103, 227 ... a104=104, a105=105, a106=106, a107=107, a108=108, a109=109, a110=110, 228 ... a111=111, a112=112, a113=113, a114=114, a115=115, a116=116, a117=117, 229 ... a118=118, a119=119, a120=120, a121=121, a122=122, a123=123, a124=124, 230 ... a125=125, a126=126, a127=127, a128=128, a129=129, a130=130, a131=131, 231 ... a132=132, a133=133, a134=134, a135=135, a136=136, a137=137, a138=138, 232 ... a139=139, a140=140, a141=141, a142=142, a143=143, a144=144, a145=145, 233 ... a146=146, a147=147, a148=148, a149=149, a150=150, a151=151, a152=152, 234 ... a153=153, a154=154, a155=155, a156=156, a157=157, a158=158, a159=159, 235 ... a160=160, a161=161, a162=162, a163=163, a164=164, a165=165, a166=166, 236 ... a167=167, a168=168, a169=169, a170=170, a171=171, a172=172, a173=173, 237 ... a174=174, a175=175, a176=176, a177=177, a178=178, a179=179, a180=180, 238 ... a181=181, a182=182, a183=183, a184=184, a185=185, a186=186, a187=187, 239 ... a188=188, a189=189, a190=190, a191=191, a192=192, a193=193, a194=194, 240 ... a195=195, a196=196, a197=197, a198=198, a199=199, a200=200, a201=201, 241 ... a202=202, a203=203, a204=204, a205=205, a206=206, a207=207, a208=208, 242 ... a209=209, a210=210, a211=211, a212=212, a213=213, a214=214, a215=215, 243 ... a216=216, a217=217, a218=218, a219=219, a220=220, a221=221, a222=222, 244 ... a223=223, a224=224, a225=225, a226=226, a227=227, a228=228, a229=229, 245 ... a230=230, a231=231, a232=232, a233=233, a234=234, a235=235, a236=236, 246 ... a237=237, a238=238, a239=239, a240=240, a241=241, a242=242, a243=243, 247 ... a244=244, a245=245, a246=246, a247=247, a248=248, a249=249, a250=250, 248 ... a251=251, a252=252, a253=253, a254=254) # doctest: +ELLIPSIS 249 () [('a000', 0), ('a001', 1), ('a002', 2), ..., ('a253', 253), ('a254', 254)] 250 >>> g(a000=0, a001=1, a002=2, a003=3, a004=4, a005=5, a006=6, a007=7, a008=8, 251 ... a009=9, a010=10, a011=11, a012=12, a013=13, a014=14, a015=15, a016=16, 252 ... a017=17, a018=18, a019=19, a020=20, a021=21, a022=22, a023=23, a024=24, 253 ... a025=25, a026=26, a027=27, a028=28, a029=29, a030=30, a031=31, a032=32, 254 ... a033=33, a034=34, a035=35, a036=36, a037=37, a038=38, a039=39, a040=40, 255 ... a041=41, a042=42, a043=43, a044=44, a045=45, a046=46, a047=47, a048=48, 256 ... a049=49, a050=50, a051=51, a052=52, a053=53, a054=54, a055=55, a056=56, 257 ... a057=57, a058=58, a059=59, a060=60, a061=61, a062=62, a063=63, a064=64, 258 ... a065=65, a066=66, a067=67, a068=68, a069=69, a070=70, a071=71, a072=72, 259 ... a073=73, a074=74, a075=75, a076=76, a077=77, a078=78, a079=79, a080=80, 260 ... a081=81, a082=82, a083=83, a084=84, a085=85, a086=86, a087=87, a088=88, 261 ... a089=89, a090=90, a091=91, a092=92, a093=93, a094=94, a095=95, a096=96, 262 ... a097=97, a098=98, a099=99, a100=100, a101=101, a102=102, a103=103, 263 ... a104=104, a105=105, a106=106, a107=107, a108=108, a109=109, a110=110, 264 ... a111=111, a112=112, a113=113, a114=114, a115=115, a116=116, a117=117, 265 ... a118=118, a119=119, a120=120, a121=121, a122=122, a123=123, a124=124, 266 ... a125=125, a126=126, a127=127, a128=128, a129=129, a130=130, a131=131, 267 ... a132=132, a133=133, a134=134, a135=135, a136=136, a137=137, a138=138, 268 ... a139=139, a140=140, a141=141, a142=142, a143=143, a144=144, a145=145, 269 ... a146=146, a147=147, a148=148, a149=149, a150=150, a151=151, a152=152, 270 ... a153=153, a154=154, a155=155, a156=156, a157=157, a158=158, a159=159, 271 ... a160=160, a161=161, a162=162, a163=163, a164=164, a165=165, a166=166, 272 ... a167=167, a168=168, a169=169, a170=170, a171=171, a172=172, a173=173, 273 ... a174=174, a175=175, a176=176, a177=177, a178=178, a179=179, a180=180, 274 ... a181=181, a182=182, a183=183, a184=184, a185=185, a186=186, a187=187, 275 ... a188=188, a189=189, a190=190, a191=191, a192=192, a193=193, a194=194, 276 ... a195=195, a196=196, a197=197, a198=198, a199=199, a200=200, a201=201, 277 ... a202=202, a203=203, a204=204, a205=205, a206=206, a207=207, a208=208, 278 ... a209=209, a210=210, a211=211, a212=212, a213=213, a214=214, a215=215, 279 ... a216=216, a217=217, a218=218, a219=219, a220=220, a221=221, a222=222, 280 ... a223=223, a224=224, a225=225, a226=226, a227=227, a228=228, a229=229, 281 ... a230=230, a231=231, a232=232, a233=233, a234=234, a235=235, a236=236, 282 ... a237=237, a238=238, a239=239, a240=240, a241=241, a242=242, a243=243, 283 ... a244=244, a245=245, a246=246, a247=247, a248=248, a249=249, a250=250, 284 ... a251=251, a252=252, a253=253, a254=254, a255=255) 285 Traceback (most recent call last): 286 File "<doctest test.test_syntax[35]>", line 1 287 SyntaxError: more than 255 arguments 288 289 >>> class C: 290 ... def meth(self, *args): 291 ... return args 292 >>> obj = C() 293 >>> obj.meth( 294 ... 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 295 ... 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 296 ... 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 297 ... 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 298 ... 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 299 ... 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 300 ... 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 301 ... 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 302 ... 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 303 ... 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 304 ... 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 305 ... 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 306 ... 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 307 ... 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 308 ... 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 309 ... 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 310 ... 248, 249, 250, 251, 252, 253, 254) # doctest: +ELLIPSIS 311 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ..., 252, 253, 254) 312 >>> obj.meth( 313 ... 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 314 ... 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 315 ... 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 316 ... 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 317 ... 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 318 ... 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 319 ... 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 320 ... 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 321 ... 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 322 ... 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 323 ... 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 324 ... 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 325 ... 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 326 ... 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 327 ... 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 328 ... 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 329 ... 248, 249, 250, 251, 252, 253, 254, 255) 330 Traceback (most recent call last): 331 File "<doctest test.test_syntax[38]>", line 1 332 SyntaxError: more than 255 arguments 333 334 >>> f(lambda x: x[0] = 3) 335 Traceback (most recent call last): 336 File "<doctest test.test_syntax[27]>", line 1 337 SyntaxError: lambda cannot contain assignment 338 339 The grammar accepts any test (basically, any expression) in the 340 keyword slot of a call site. Test a few different options. 341 342 >>> f(x()=2) 343 Traceback (most recent call last): 344 File "<doctest test.test_syntax[28]>", line 1 345 SyntaxError: keyword can't be an expression 346 >>> f(a or b=1) 347 Traceback (most recent call last): 348 File "<doctest test.test_syntax[29]>", line 1 349 SyntaxError: keyword can't be an expression 350 >>> f(x.y=1) 351 Traceback (most recent call last): 352 File "<doctest test.test_syntax[30]>", line 1 353 SyntaxError: keyword can't be an expression 354 355 356 More set_context(): 357 358 >>> (x for x in x) += 1 359 Traceback (most recent call last): 360 File "<doctest test.test_syntax[31]>", line 1 361 SyntaxError: can't assign to generator expression 362 >>> None += 1 363 Traceback (most recent call last): 364 File "<doctest test.test_syntax[32]>", line 1 365 SyntaxError: cannot assign to None 366 >>> f() += 1 367 Traceback (most recent call last): 368 File "<doctest test.test_syntax[33]>", line 1 369 SyntaxError: can't assign to function call 370 371 372 Test continue in finally in weird combinations. 373 374 continue in for loop under finally should be ok. 375 376 >>> def test(): 377 ... try: 378 ... pass 379 ... finally: 380 ... for abc in range(10): 381 ... continue 382 ... print abc 383 >>> test() 384 9 385 386 Start simple, a continue in a finally should not be allowed. 387 388 >>> def test(): 389 ... for abc in range(10): 390 ... try: 391 ... pass 392 ... finally: 393 ... continue 394 Traceback (most recent call last): 395 ... 396 File "<doctest test.test_syntax[36]>", line 6 397 SyntaxError: 'continue' not supported inside 'finally' clause 398 399 This is essentially a continue in a finally which should not be allowed. 400 401 >>> def test(): 402 ... for abc in range(10): 403 ... try: 404 ... pass 405 ... finally: 406 ... try: 407 ... continue 408 ... except: 409 ... pass 410 Traceback (most recent call last): 411 ... 412 File "<doctest test.test_syntax[37]>", line 6 413 SyntaxError: 'continue' not supported inside 'finally' clause 414 415 >>> def foo(): 416 ... try: 417 ... pass 418 ... finally: 419 ... continue 420 Traceback (most recent call last): 421 ... 422 File "<doctest test.test_syntax[38]>", line 5 423 SyntaxError: 'continue' not supported inside 'finally' clause 424 425 >>> def foo(): 426 ... for a in (): 427 ... try: 428 ... pass 429 ... finally: 430 ... continue 431 Traceback (most recent call last): 432 ... 433 File "<doctest test.test_syntax[39]>", line 6 434 SyntaxError: 'continue' not supported inside 'finally' clause 435 436 >>> def foo(): 437 ... for a in (): 438 ... try: 439 ... pass 440 ... finally: 441 ... try: 442 ... continue 443 ... finally: 444 ... pass 445 Traceback (most recent call last): 446 ... 447 File "<doctest test.test_syntax[40]>", line 7 448 SyntaxError: 'continue' not supported inside 'finally' clause 449 450 >>> def foo(): 451 ... for a in (): 452 ... try: pass 453 ... finally: 454 ... try: 455 ... pass 456 ... except: 457 ... continue 458 Traceback (most recent call last): 459 ... 460 File "<doctest test.test_syntax[41]>", line 8 461 SyntaxError: 'continue' not supported inside 'finally' clause 462 463 There is one test for a break that is not in a loop. The compiler 464 uses a single data structure to keep track of try-finally and loops, 465 so we need to be sure that a break is actually inside a loop. If it 466 isn't, there should be a syntax error. 467 468 >>> try: 469 ... print 1 470 ... break 471 ... print 2 472 ... finally: 473 ... print 3 474 Traceback (most recent call last): 475 ... 476 File "<doctest test.test_syntax[42]>", line 3 477 SyntaxError: 'break' outside loop 478 479 This raises a SyntaxError, it used to raise a SystemError. 480 Context for this change can be found on issue #27514 481 482 In 2.5 there was a missing exception and an assert was triggered in a debug 483 build. The number of blocks must be greater than CO_MAXBLOCKS. SF #1565514 484 485 >>> while 1: 486 ... while 2: 487 ... while 3: 488 ... while 4: 489 ... while 5: 490 ... while 6: 491 ... while 8: 492 ... while 9: 493 ... while 10: 494 ... while 11: 495 ... while 12: 496 ... while 13: 497 ... while 14: 498 ... while 15: 499 ... while 16: 500 ... while 17: 501 ... while 18: 502 ... while 19: 503 ... while 20: 504 ... while 21: 505 ... while 22: 506 ... break 507 Traceback (most recent call last): 508 ... 509 SyntaxError: too many statically nested blocks 510 511 Misuse of the global statement can lead to a few unique syntax errors. 512 513 >>> def f(x): 514 ... global x 515 ... # doctest: +ELLIPSIS 516 Traceback (most recent call last): 517 ... 518 SyntaxError: name 'x' is local and global (<doctest ...>, line 1) 519 520 521 This tests assignment-context; there was a bug in Python 2.5 where compiling 522 a complex 'if' (one with 'elif') would fail to notice an invalid suite, 523 leading to spurious errors. 524 525 >>> if 1: 526 ... x() = 1 527 ... elif 1: 528 ... pass 529 Traceback (most recent call last): 530 ... 531 File "<doctest test.test_syntax[44]>", line 2 532 SyntaxError: can't assign to function call 533 534 >>> if 1: 535 ... pass 536 ... elif 1: 537 ... x() = 1 538 Traceback (most recent call last): 539 ... 540 File "<doctest test.test_syntax[45]>", line 4 541 SyntaxError: can't assign to function call 542 543 >>> if 1: 544 ... x() = 1 545 ... elif 1: 546 ... pass 547 ... else: 548 ... pass 549 Traceback (most recent call last): 550 ... 551 File "<doctest test.test_syntax[46]>", line 2 552 SyntaxError: can't assign to function call 553 554 >>> if 1: 555 ... pass 556 ... elif 1: 557 ... x() = 1 558 ... else: 559 ... pass 560 Traceback (most recent call last): 561 ... 562 File "<doctest test.test_syntax[47]>", line 4 563 SyntaxError: can't assign to function call 564 565 >>> if 1: 566 ... pass 567 ... elif 1: 568 ... pass 569 ... else: 570 ... x() = 1 571 Traceback (most recent call last): 572 ... 573 File "<doctest test.test_syntax[48]>", line 6 574 SyntaxError: can't assign to function call 575 576 Test the "raise X, Y[, Z]" form: 577 578 >>> raise ArithmeticError, 'bad number' 579 Traceback (most recent call last): 580 ... 581 ArithmeticError: bad number 582 >>> raise ArithmeticError, 'bad number', None 583 Traceback (most recent call last): 584 ... 585 ArithmeticError: bad number 586 587 588 >>> f(a=23, a=234) 589 Traceback (most recent call last): 590 ... 591 File "<doctest test.test_syntax[49]>", line 1 592 SyntaxError: keyword argument repeated 593 594 >>> del () 595 Traceback (most recent call last): 596 ... 597 File "<doctest test.test_syntax[50]>", line 1 598 SyntaxError: can't delete () 599 600 >>> {1, 2, 3} = 42 601 Traceback (most recent call last): 602 ... 603 File "<doctest test.test_syntax[50]>", line 1 604 SyntaxError: can't assign to literal 605 606 Corner-case that used to fail to raise the correct error: 607 608 >>> def f(x=lambda __debug__:0): pass 609 Traceback (most recent call last): 610 SyntaxError: cannot assign to __debug__ 611 612 Corner-case that used to crash: 613 614 >>> def f(*xx, **__debug__): pass 615 Traceback (most recent call last): 616 SyntaxError: cannot assign to __debug__ 617 618 """ 619 620 import re 621 import unittest 622 import warnings 623 624 from test import support 625 626 class SyntaxTestCase(unittest.TestCase): 627 628 def _check_error(self, code, errtext, 629 filename="<testcase>", mode="exec", subclass=None, lineno=None, offset=None): 630 """Check that compiling code raises SyntaxError with errtext. 631 632 errtest is a regular expression that must be present in the 633 test of the exception raised. If subclass is specified it 634 is the expected subclass of SyntaxError (e.g. IndentationError). 635 """ 636 try: 637 compile(code, filename or "<testcase>", mode) 638 except SyntaxError as err: 639 if subclass and not isinstance(err, subclass): 640 self.fail("SyntaxError is not a %s" % subclass.__name__) 641 mo = re.search(errtext, str(err)) 642 if mo is None: 643 self.fail("%s did not contain '%r'" % (err, errtext,)) 644 if filename is not None: 645 self.assertEqual(err.filename, filename) 646 if lineno is not None: 647 self.assertEqual(err.lineno, lineno) 648 if offset is not None: 649 self.assertEqual(err.offset, offset) 650 else: 651 self.fail("compile() did not raise SyntaxError") 652 653 def test_paren_arg_with_default(self): 654 self._check_error("def f((x)=23): pass", 655 "parenthesized arg with default") 656 657 def test_assign_repr(self): 658 with support.check_py3k_warnings(('backquote not supported', 659 SyntaxWarning)): 660 self._check_error("`1` = 1", "assign to repr") 661 662 def test_assign_call(self): 663 self._check_error("f() = 1", "assign") 664 665 def test_assign_del(self): 666 self._check_error("del f()", "delete") 667 668 def test_global_err_then_warn(self): 669 # Bug tickler: The SyntaxError raised for one global statement 670 # shouldn't be clobbered by a SyntaxWarning issued for a later one. 671 source = """if 1: 672 def error(a): 673 global a # SyntaxError 674 def warning(): 675 b = 1 676 global b # SyntaxWarning 677 """ 678 with support.check_warnings((".*assigned to before global declaration", 679 SyntaxWarning)): 680 self._check_error(source, "local and global", lineno=2) 681 682 def test_misuse_global(self): 683 source = """if 1: 684 def f(): 685 print(x) 686 global x 687 """ 688 with support.check_warnings(('.*used prior to global declaration', 689 SyntaxWarning)): 690 compile(source, '<testcase>', 'exec') 691 692 def test_misuse_global_2(self): 693 source = """if 1: 694 def f(): 695 x = 1 696 global x 697 """ 698 with support.check_warnings(('.*assigned to before global declaration', 699 SyntaxWarning)): 700 compile(source, '<testcase>', 'exec') 701 702 def test_break_outside_loop(self): 703 self._check_error("break", "outside loop") 704 705 def test_delete_deref(self): 706 source = """if 1: 707 def foo(x): 708 def bar(): 709 print(x) 710 del x 711 """ 712 self._check_error(source, "nested scope", filename=None) 713 714 def test_unexpected_indent(self): 715 self._check_error("foo()\n bar()\n", "unexpected indent", 716 subclass=IndentationError) 717 718 def test_no_indent(self): 719 self._check_error("if 1:\nfoo()", "expected an indented block", 720 subclass=IndentationError) 721 722 def test_bad_outdent(self): 723 self._check_error("if 1:\n foo()\n bar()", 724 "unindent does not match .* level", 725 subclass=IndentationError) 726 727 def test_kwargs_last(self): 728 self._check_error("int(base=10, '2')", "non-keyword arg") 729 730 def test_main(): 731 support.run_unittest(SyntaxTestCase) 732 from test import test_syntax 733 support.run_doctest(test_syntax, verbosity=True) 734 735 if __name__ == "__main__": 736 test_main() 737