Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 586f3db

Browse files
authored
bpo-28964: add line number of node (if available) to ast.literal_eval error messages (GH-23677)
1 parent bb70b2a commit 586f3db

3 files changed

Lines changed: 17 additions & 1 deletion

File tree

Lib/ast.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,10 @@ def literal_eval(node_or_string):
6363
if isinstance(node_or_string, Expression):
6464
node_or_string = node_or_string.body
6565
def _raise_malformed_node(node):
66-
raise ValueError(f'malformed node or string: {node!r}')
66+
msg = "malformed node or string"
67+
if lno := getattr(node, 'lineno', None):
68+
msg += f' on line {lno}'
69+
raise ValueError(msg + f': {node!r}')
6770
def _convert_num(node):
6871
if not isinstance(node, Constant) or type(node.value) not in (int, float, complex):
6972
_raise_malformed_node(node)

Lib/test/test_ast.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1011,6 +1011,18 @@ def test_literal_eval_trailing_ws(self):
10111011
self.assertEqual(ast.literal_eval(" \t -1"), -1)
10121012
self.assertRaises(IndentationError, ast.literal_eval, "\n -1")
10131013

1014+
def test_literal_eval_malformed_lineno(self):
1015+
msg = r'malformed node or string on line 3:'
1016+
with self.assertRaisesRegex(ValueError, msg):
1017+
ast.literal_eval("{'a': 1,\n'b':2,\n'c':++3,\n'd':4}")
1018+
1019+
node = ast.UnaryOp(
1020+
ast.UAdd(), ast.UnaryOp(ast.UAdd(), ast.Constant(6)))
1021+
self.assertIsNone(getattr(node, 'lineno', None))
1022+
msg = r'malformed node or string:'
1023+
with self.assertRaisesRegex(ValueError, msg):
1024+
ast.literal_eval(node)
1025+
10141026
def test_bad_integer(self):
10151027
# issue13436: Bad error message with invalid numeric values
10161028
body = [ast.ImportFrom(module='time',
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
:func:`ast.literal_eval` adds line number information (if available) in error message for malformed nodes.

0 commit comments

Comments
 (0)