21
21
def to_tuple (t ):
22
22
if t is None or isinstance (t , (str , int , complex )) or t is Ellipsis :
23
23
return t
24
- elif isinstance (t , list ):
25
- return [to_tuple (e ) for e in t ]
24
+ elif isinstance (t , ( list , tuple ) ):
25
+ return type ( t )( [to_tuple (e ) for e in t ])
26
26
result = [t .__class__ .__name__ ]
27
27
if hasattr (t , 'lineno' ) and hasattr (t , 'col_offset' ):
28
28
result .append ((t .lineno , t .col_offset ))
@@ -274,7 +274,7 @@ def to_tuple(t):
274
274
# Tuple
275
275
"1,2,3" ,
276
276
# Tuple
277
- "(1,2 ,3)" ,
277
+ "(1,x ,3)" ,
278
278
# Empty tuple
279
279
"()" ,
280
280
# Combination
@@ -357,6 +357,15 @@ def test_ast_validation(self):
357
357
tree = ast .parse (snippet )
358
358
compile (tree , '<string>' , 'exec' )
359
359
360
+ def test_optimization_levels (self ):
361
+ cases = [(- 1 , __debug__ ), (0 , True ), (1 , False ), (2 , False )]
362
+ for (optval , expected ) in cases :
363
+ with self .subTest (optval = optval , expected = expected ):
364
+ res = ast .parse ("__debug__" , optimize = optval )
365
+ self .assertIsInstance (res .body [0 ], ast .Expr )
366
+ self .assertIsInstance (res .body [0 ].value , ast .Constant )
367
+ self .assertEqual (res .body [0 ].value .value , expected )
368
+
360
369
def test_invalid_position_information (self ):
361
370
invalid_linenos = [
362
371
(10 , 1 ), (- 10 , - 11 ), (10 , - 11 ), (- 5 , - 2 ), (- 5 , 1 )
@@ -948,7 +957,7 @@ def bad_normalize(*args):
948
957
self .assertRaises (TypeError , ast .parse , '\u03D5 ' )
949
958
950
959
def test_issue18374_binop_col_offset (self ):
951
- tree = ast .parse ('4+5+6+7 ' )
960
+ tree = ast .parse ('a+b+c+d ' )
952
961
parent_binop = tree .body [0 ].value
953
962
child_binop = parent_binop .left
954
963
grandchild_binop = child_binop .left
@@ -959,7 +968,7 @@ def test_issue18374_binop_col_offset(self):
959
968
self .assertEqual (grandchild_binop .col_offset , 0 )
960
969
self .assertEqual (grandchild_binop .end_col_offset , 3 )
961
970
962
- tree = ast .parse ('4+5 -\\ \n 6-7 ' )
971
+ tree = ast .parse ('a+b -\\ \n c-d ' )
963
972
parent_binop = tree .body [0 ].value
964
973
child_binop = parent_binop .left
965
974
grandchild_binop = child_binop .left
@@ -1266,13 +1275,14 @@ def test_dump_incomplete(self):
1266
1275
)
1267
1276
1268
1277
def test_copy_location (self ):
1269
- src = ast .parse ('1 + 1' , mode = 'eval' )
1278
+ src = ast .parse ('x + 1' , mode = 'eval' )
1270
1279
src .body .right = ast .copy_location (ast .Constant (2 ), src .body .right )
1271
1280
self .assertEqual (ast .dump (src , include_attributes = True ),
1272
- 'Expression(body=BinOp(left=Constant(value=1, lineno=1, col_offset=0, '
1273
- 'end_lineno=1, end_col_offset=1), op=Add(), right=Constant(value=2, '
1274
- 'lineno=1, col_offset=4, end_lineno=1, end_col_offset=5), lineno=1, '
1275
- 'col_offset=0, end_lineno=1, end_col_offset=5))'
1281
+ "Expression(body=BinOp(left=Name(id='x', ctx=Load(), lineno=1, "
1282
+ "col_offset=0, end_lineno=1, end_col_offset=1), op=Add(), "
1283
+ "right=Constant(value=2, lineno=1, col_offset=4, end_lineno=1, "
1284
+ "end_col_offset=5), lineno=1, col_offset=0, end_lineno=1, "
1285
+ "end_col_offset=5))"
1276
1286
)
1277
1287
src = ast .Call (col_offset = 1 , lineno = 1 , end_lineno = 1 , end_col_offset = 1 )
1278
1288
new = ast .copy_location (src , ast .Call (col_offset = None , lineno = None ))
@@ -1302,20 +1312,22 @@ def test_fix_missing_locations(self):
1302
1312
)
1303
1313
1304
1314
def test_increment_lineno (self ):
1305
- src = ast .parse ('1 + 1' , mode = 'eval' )
1315
+ src = ast .parse ('x + 1' , mode = 'eval' )
1306
1316
self .assertEqual (ast .increment_lineno (src , n = 3 ), src )
1307
1317
self .assertEqual (ast .dump (src , include_attributes = True ),
1308
- 'Expression(body=BinOp(left=Constant(value=1, lineno=4, col_offset=0, '
1309
- 'end_lineno=4, end_col_offset=1), op=Add(), right=Constant(value=1, '
1318
+ 'Expression(body=BinOp(left=Name(id=\' x\' , ctx=Load(), '
1319
+ 'lineno=4, col_offset=0, end_lineno=4, end_col_offset=1), '
1320
+ 'op=Add(), right=Constant(value=1, '
1310
1321
'lineno=4, col_offset=4, end_lineno=4, end_col_offset=5), lineno=4, '
1311
1322
'col_offset=0, end_lineno=4, end_col_offset=5))'
1312
1323
)
1313
1324
# issue10869: do not increment lineno of root twice
1314
- src = ast .parse ('1 + 1 ' , mode = 'eval' )
1325
+ src = ast .parse ('y + 2 ' , mode = 'eval' )
1315
1326
self .assertEqual (ast .increment_lineno (src .body , n = 3 ), src .body )
1316
1327
self .assertEqual (ast .dump (src , include_attributes = True ),
1317
- 'Expression(body=BinOp(left=Constant(value=1, lineno=4, col_offset=0, '
1318
- 'end_lineno=4, end_col_offset=1), op=Add(), right=Constant(value=1, '
1328
+ 'Expression(body=BinOp(left=Name(id=\' y\' , ctx=Load(), '
1329
+ 'lineno=4, col_offset=0, end_lineno=4, end_col_offset=1), '
1330
+ 'op=Add(), right=Constant(value=2, '
1319
1331
'lineno=4, col_offset=4, end_lineno=4, end_col_offset=5), lineno=4, '
1320
1332
'col_offset=0, end_lineno=4, end_col_offset=5))'
1321
1333
)
@@ -1446,9 +1458,9 @@ def test_literal_eval(self):
1446
1458
self .assertEqual (ast .literal_eval ('+3.25' ), 3.25 )
1447
1459
self .assertEqual (ast .literal_eval ('-3.25' ), - 3.25 )
1448
1460
self .assertEqual (repr (ast .literal_eval ('-0.0' )), '-0.0' )
1449
- self .assertRaises ( ValueError , ast .literal_eval , '++6' )
1450
- self .assertRaises ( ValueError , ast .literal_eval , '+True' )
1451
- self .assertRaises ( ValueError , ast .literal_eval , '2+3' )
1461
+ self .assertEqual ( ast .literal_eval ( '++6' ), 6 )
1462
+ self .assertEqual ( ast .literal_eval ( '+True' ), 1 )
1463
+ self .assertEqual ( ast .literal_eval ( '2+3' ), 5 )
1452
1464
1453
1465
def test_literal_eval_str_int_limit (self ):
1454
1466
with support .adjust_int_max_str_digits (4000 ):
@@ -1473,11 +1485,11 @@ def test_literal_eval_complex(self):
1473
1485
self .assertEqual (ast .literal_eval ('3.25-6.75j' ), 3.25 - 6.75j )
1474
1486
self .assertEqual (ast .literal_eval ('-3.25-6.75j' ), - 3.25 - 6.75j )
1475
1487
self .assertEqual (ast .literal_eval ('(3+6j)' ), 3 + 6j )
1476
- self .assertRaises ( ValueError , ast .literal_eval , '-6j+3' )
1477
- self .assertRaises ( ValueError , ast .literal_eval , '-6j+3j' )
1478
- self .assertRaises ( ValueError , ast .literal_eval , '3+-6j' )
1479
- self .assertRaises ( ValueError , ast .literal_eval , '3+(0+6j)' )
1480
- self .assertRaises ( ValueError , ast .literal_eval , '-(3+6j)' )
1488
+ self .assertEqual ( ast .literal_eval ( '-6j+3' ), 3 - 6j )
1489
+ self .assertEqual ( ast .literal_eval ( '-6j+3j' ), - 3j )
1490
+ self .assertEqual ( ast .literal_eval ( '3+-6j' ), 3 - 6j )
1491
+ self .assertEqual ( ast .literal_eval ( '3+(0+6j)' ), 3 + 6j )
1492
+ self .assertEqual ( ast .literal_eval ( '-(3+6j)' ), - 3 - 6j )
1481
1493
1482
1494
def test_literal_eval_malformed_dict_nodes (self ):
1483
1495
malformed = ast .Dict (keys = [ast .Constant (1 ), ast .Constant (2 )], values = [ast .Constant (3 )])
@@ -1494,7 +1506,7 @@ def test_literal_eval_trailing_ws(self):
1494
1506
def test_literal_eval_malformed_lineno (self ):
1495
1507
msg = r'malformed node or string on line 3:'
1496
1508
with self .assertRaisesRegex (ValueError , msg ):
1497
- ast .literal_eval ("{'a': 1,\n 'b':2,\n 'c':++3 ,\n 'd':4}" )
1509
+ ast .literal_eval ("{'a': 1,\n 'b':2,\n 'c':++x ,\n 'd':4}" )
1498
1510
1499
1511
node = ast .UnaryOp (
1500
1512
ast .UAdd (), ast .UnaryOp (ast .UAdd (), ast .Constant (6 )))
@@ -2265,7 +2277,7 @@ def test_load_const(self):
2265
2277
consts )
2266
2278
2267
2279
def test_literal_eval (self ):
2268
- tree = ast .parse ("1 + 2" )
2280
+ tree = ast .parse ("x + 2" )
2269
2281
binop = tree .body [0 ].value
2270
2282
2271
2283
new_left = ast .Constant (value = 10 )
@@ -2479,14 +2491,14 @@ def test_slices(self):
2479
2491
2480
2492
def test_binop (self ):
2481
2493
s = dedent ('''
2482
- (1 * 2 + (3 ) +
2494
+ (1 * x + (3 ) +
2483
2495
4
2484
2496
)
2485
2497
''' ).strip ()
2486
2498
binop = self ._parse_value (s )
2487
2499
self ._check_end_pos (binop , 2 , 6 )
2488
2500
self ._check_content (s , binop .right , '4' )
2489
- self ._check_content (s , binop .left , '1 * 2 + (3 )' )
2501
+ self ._check_content (s , binop .left , '1 * x + (3 )' )
2490
2502
self ._check_content (s , binop .left .right , '3' )
2491
2503
2492
2504
def test_boolop (self ):
@@ -3039,7 +3051,7 @@ def main():
3039
3051
('Module' , [('FunctionDef' , (1 , 0 , 1 , 38 ), 'f' , ('arguments' , [], [], None , [], [], None , []), [('Pass' , (1 , 34 , 1 , 38 ))], [], None , None , [('TypeVar' , (1 , 6 , 1 , 19 ), 'T' , ('Tuple' , (1 , 9 , 1 , 19 ), [('Name' , (1 , 10 , 1 , 13 ), 'int' , ('Load' ,)), ('Name' , (1 , 15 , 1 , 18 ), 'str' , ('Load' ,))], ('Load' ,))), ('TypeVarTuple' , (1 , 21 , 1 , 24 ), 'Ts' ), ('ParamSpec' , (1 , 26 , 1 , 29 ), 'P' )])], []),
3040
3052
]
3041
3053
single_results = [
3042
- ('Interactive' , [('Expr' , (1 , 0 , 1 , 3 ), ('BinOp ' , (1 , 0 , 1 , 3 ), ( 'Constant' , ( 1 , 0 , 1 , 1 ), 1 , None ), ( 'Add' ,), ( 'Constant' , ( 1 , 2 , 1 , 3 ), 2 , None ) ))]),
3054
+ ('Interactive' , [('Expr' , (1 , 0 , 1 , 3 ), ('Constant ' , (1 , 0 , 1 , 3 ), 3 , None ))]),
3043
3055
]
3044
3056
eval_results = [
3045
3057
('Expression' , ('Constant' , (1 , 0 , 1 , 4 ), None , None )),
@@ -3073,9 +3085,9 @@ def main():
3073
3085
('Expression' , ('Name' , (1 , 0 , 1 , 1 ), 'v' , ('Load' ,))),
3074
3086
('Expression' , ('List' , (1 , 0 , 1 , 7 ), [('Constant' , (1 , 1 , 1 , 2 ), 1 , None ), ('Constant' , (1 , 3 , 1 , 4 ), 2 , None ), ('Constant' , (1 , 5 , 1 , 6 ), 3 , None )], ('Load' ,))),
3075
3087
('Expression' , ('List' , (1 , 0 , 1 , 2 ), [], ('Load' ,))),
3076
- ('Expression' , ('Tuple ' , (1 , 0 , 1 , 5 ), [( 'Constant' , ( 1 , 0 , 1 , 1 ), 1 , None ), ( 'Constant' , ( 1 , 2 , 1 , 3 ), 2 , None ), ( 'Constant' , ( 1 , 4 , 1 , 5 ), 3 , None )], ( 'Load' ,) )),
3077
- ('Expression' , ('Tuple' , (1 , 0 , 1 , 7 ), [('Constant' , (1 , 1 , 1 , 2 ), 1 , None ), ('Constant ' , (1 , 3 , 1 , 4 ), 2 , None ), ('Constant' , (1 , 5 , 1 , 6 ), 3 , None )], ('Load' ,))),
3078
- ('Expression' , ('Tuple ' , (1 , 0 , 1 , 2 ), [], ( 'Load' ,) )),
3088
+ ('Expression' , ('Constant ' , (1 , 0 , 1 , 5 ), ( 1 , 2 , 3 ), None )),
3089
+ ('Expression' , ('Tuple' , (1 , 0 , 1 , 7 ), [('Constant' , (1 , 1 , 1 , 2 ), 1 , None ), ('Name ' , (1 , 3 , 1 , 4 ), 'x' , ( 'Load' ,) ), ('Constant' , (1 , 5 , 1 , 6 ), 3 , None )], ('Load' ,))),
3090
+ ('Expression' , ('Constant ' , (1 , 0 , 1 , 2 ), (), None )),
3079
3091
('Expression' , ('Call' , (1 , 0 , 1 , 17 ), ('Attribute' , (1 , 0 , 1 , 7 ), ('Attribute' , (1 , 0 , 1 , 5 ), ('Attribute' , (1 , 0 , 1 , 3 ), ('Name' , (1 , 0 , 1 , 1 ), 'a' , ('Load' ,)), 'b' , ('Load' ,)), 'c' , ('Load' ,)), 'd' , ('Load' ,)), [('Subscript' , (1 , 8 , 1 , 16 ), ('Attribute' , (1 , 8 , 1 , 11 ), ('Name' , (1 , 8 , 1 , 9 ), 'a' , ('Load' ,)), 'b' , ('Load' ,)), ('Slice' , (1 , 12 , 1 , 15 ), ('Constant' , (1 , 12 , 1 , 13 ), 1 , None ), ('Constant' , (1 , 14 , 1 , 15 ), 2 , None ), None ), ('Load' ,))], [])),
3080
3092
]
3081
3093
main ()
0 commit comments