bpo-31778: Make ast.literal_eval() more strict. (#4035) · python/cpython@d8ac4d1
@@ -551,14 +551,37 @@ def test_literal_eval(self):
551551self.assertEqual(ast.literal_eval('{1, 2, 3}'), {1, 2, 3})
552552self.assertEqual(ast.literal_eval('b"hi"'), b"hi")
553553self.assertRaises(ValueError, ast.literal_eval, 'foo()')
554+self.assertEqual(ast.literal_eval('6'), 6)
555+self.assertEqual(ast.literal_eval('+6'), 6)
554556self.assertEqual(ast.literal_eval('-6'), -6)
555-self.assertEqual(ast.literal_eval('-6j+3'), 3-6j)
556557self.assertEqual(ast.literal_eval('3.25'), 3.25)
557-558-def test_literal_eval_issue4907(self):
559-self.assertEqual(ast.literal_eval('2j'), 2j)
560-self.assertEqual(ast.literal_eval('10 + 2j'), 10 + 2j)
561-self.assertEqual(ast.literal_eval('1.5 - 2j'), 1.5 - 2j)
558+self.assertEqual(ast.literal_eval('+3.25'), 3.25)
559+self.assertEqual(ast.literal_eval('-3.25'), -3.25)
560+self.assertEqual(repr(ast.literal_eval('-0.0')), '-0.0')
561+self.assertRaises(ValueError, ast.literal_eval, '++6')
562+self.assertRaises(ValueError, ast.literal_eval, '+True')
563+self.assertRaises(ValueError, ast.literal_eval, '2+3')
564+565+def test_literal_eval_complex(self):
566+# Issue #4907
567+self.assertEqual(ast.literal_eval('6j'), 6j)
568+self.assertEqual(ast.literal_eval('-6j'), -6j)
569+self.assertEqual(ast.literal_eval('6.75j'), 6.75j)
570+self.assertEqual(ast.literal_eval('-6.75j'), -6.75j)
571+self.assertEqual(ast.literal_eval('3+6j'), 3+6j)
572+self.assertEqual(ast.literal_eval('-3+6j'), -3+6j)
573+self.assertEqual(ast.literal_eval('3-6j'), 3-6j)
574+self.assertEqual(ast.literal_eval('-3-6j'), -3-6j)
575+self.assertEqual(ast.literal_eval('3.25+6.75j'), 3.25+6.75j)
576+self.assertEqual(ast.literal_eval('-3.25+6.75j'), -3.25+6.75j)
577+self.assertEqual(ast.literal_eval('3.25-6.75j'), 3.25-6.75j)
578+self.assertEqual(ast.literal_eval('-3.25-6.75j'), -3.25-6.75j)
579+self.assertEqual(ast.literal_eval('(3+6j)'), 3+6j)
580+self.assertRaises(ValueError, ast.literal_eval, '-6j+3')
581+self.assertRaises(ValueError, ast.literal_eval, '-6j+3j')
582+self.assertRaises(ValueError, ast.literal_eval, '3+-6j')
583+self.assertRaises(ValueError, ast.literal_eval, '3+(0+6j)')
584+self.assertRaises(ValueError, ast.literal_eval, '-(3+6j)')
562585563586def test_bad_integer(self):
564587# issue13436: Bad error message with invalid numeric values
@@ -1077,11 +1100,11 @@ def test_literal_eval(self):
10771100ast.copy_location(new_left, binop.left)
10781101binop.left = new_left
107911021080-new_right = ast.Constant(value=20)
1103+new_right = ast.Constant(value=20j)
10811104ast.copy_location(new_right, binop.right)
10821105binop.right = new_right
108311061084-self.assertEqual(ast.literal_eval(binop), 30)
1107+self.assertEqual(ast.literal_eval(binop), 10+20j)
108511081086110910871110def main():