[Python-checkins] bpo-28964: add line number of node (if available) to ast.literal_eval error messages (GH-23677)
isidentical
webhook-mailer at python.org
Fri Dec 25 12:04:35 EST 2020
https://github.com/python/cpython/commit/586f3dbe15139cafb2a6ffb82cea146906561844
commit: 586f3dbe15139cafb2a6ffb82cea146906561844
branch: master
author: Irit Katriel <iritkatriel at yahoo.com>
committer: isidentical <isidentical at gmail.com>
date: 2020-12-25T20:04:31+03:00
summary:
bpo-28964: add line number of node (if available) to ast.literal_eval error messages (GH-23677)
files:
A Misc/NEWS.d/next/Library/2020-12-07-13-21-00.bpo-28964.UTQikc.rst
M Lib/ast.py
M Lib/test/test_ast.py
diff --git a/Lib/ast.py b/Lib/ast.py
index 7275fe28ba812..845c80c2bbc0d 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 be4b0f78ce905..451f40d1f884d 100644
--- a/Lib/test/test_ast.py
+++ b/Lib/test/test_ast.py
@@ -1011,6 +1011,18 @@ def test_literal_eval_trailing_ws(self):
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 0000000000000..b1be0de3b223a
--- /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
More information about the Python-checkins
mailing list