bpo-28964: add line number of node (if available) to ast.literal_eval error messages (GH-23677)
This commit is contained in:
parent
bb70b2afe3
commit
586f3dbe15
|
@ -63,7 +63,10 @@ def literal_eval(node_or_string):
|
||||||
if isinstance(node_or_string, Expression):
|
if isinstance(node_or_string, Expression):
|
||||||
node_or_string = node_or_string.body
|
node_or_string = node_or_string.body
|
||||||
def _raise_malformed_node(node):
|
def _raise_malformed_node(node):
|
||||||
raise ValueError(f'malformed node or string: {node!r}')
|
msg = "malformed node or string"
|
||||||
|
if lno := getattr(node, 'lineno', None):
|
||||||
|
msg += f' on line {lno}'
|
||||||
|
raise ValueError(msg + f': {node!r}')
|
||||||
def _convert_num(node):
|
def _convert_num(node):
|
||||||
if not isinstance(node, Constant) or type(node.value) not in (int, float, complex):
|
if not isinstance(node, Constant) or type(node.value) not in (int, float, complex):
|
||||||
_raise_malformed_node(node)
|
_raise_malformed_node(node)
|
||||||
|
|
|
@ -1011,6 +1011,18 @@ Module(
|
||||||
self.assertEqual(ast.literal_eval(" \t -1"), -1)
|
self.assertEqual(ast.literal_eval(" \t -1"), -1)
|
||||||
self.assertRaises(IndentationError, ast.literal_eval, "\n -1")
|
self.assertRaises(IndentationError, ast.literal_eval, "\n -1")
|
||||||
|
|
||||||
|
def test_literal_eval_malformed_lineno(self):
|
||||||
|
msg = r'malformed node or string on line 3:'
|
||||||
|
with self.assertRaisesRegex(ValueError, msg):
|
||||||
|
ast.literal_eval("{'a': 1,\n'b':2,\n'c':++3,\n'd':4}")
|
||||||
|
|
||||||
|
node = ast.UnaryOp(
|
||||||
|
ast.UAdd(), ast.UnaryOp(ast.UAdd(), ast.Constant(6)))
|
||||||
|
self.assertIsNone(getattr(node, 'lineno', None))
|
||||||
|
msg = r'malformed node or string:'
|
||||||
|
with self.assertRaisesRegex(ValueError, msg):
|
||||||
|
ast.literal_eval(node)
|
||||||
|
|
||||||
def test_bad_integer(self):
|
def test_bad_integer(self):
|
||||||
# issue13436: Bad error message with invalid numeric values
|
# issue13436: Bad error message with invalid numeric values
|
||||||
body = [ast.ImportFrom(module='time',
|
body = [ast.ImportFrom(module='time',
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
:func:`ast.literal_eval` adds line number information (if available) in error message for malformed nodes.
|
Loading…
Reference in New Issue