From: Irit Katriel Date: Fri, 25 Dec 2020 17:04:31 +0000 (+0000) Subject: bpo-28964: add line number of node (if available) to ast.literal_eval error messages... X-Git-Tag: v3.10.0a4~80 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=586f3dbe15139cafb2a6ffb82cea146906561844;p=thirdparty%2FPython%2Fcpython.git bpo-28964: add line number of node (if available) to ast.literal_eval error messages (GH-23677) --- diff --git a/Lib/ast.py b/Lib/ast.py index 7275fe28ba81..845c80c2bbc0 100644 --- a/Lib/ast.py +++ b/Lib/ast.py @@ -63,7 +63,10 @@ def literal_eval(node_or_string): if isinstance(node_or_string, Expression): node_or_string = node_or_string.body 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): if not isinstance(node, Constant) or type(node.value) not in (int, float, complex): _raise_malformed_node(node) diff --git a/Lib/test/test_ast.py b/Lib/test/test_ast.py index be4b0f78ce90..451f40d1f884 100644 --- a/Lib/test/test_ast.py +++ b/Lib/test/test_ast.py @@ -1011,6 +1011,18 @@ Module( self.assertEqual(ast.literal_eval(" \t -1"), -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): # issue13436: Bad error message with invalid numeric values body = [ast.ImportFrom(module='time', diff --git a/Misc/NEWS.d/next/Library/2020-12-07-13-21-00.bpo-28964.UTQikc.rst b/Misc/NEWS.d/next/Library/2020-12-07-13-21-00.bpo-28964.UTQikc.rst new file mode 100644 index 000000000000..b1be0de3b223 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-12-07-13-21-00.bpo-28964.UTQikc.rst @@ -0,0 +1 @@ +:func:`ast.literal_eval` adds line number information (if available) in error message for malformed nodes. \ No newline at end of file