bpo-43914: Highlight invalid ranges in SyntaxErrors (#25525)
To improve the user experience understanding what part of the error messages associated with SyntaxErrors is wrong, we can highlight the whole error range and not only place the caret at the first character. In this way:
>>> foo(x, z for z in range(10), t, w)
File "<stdin>", line 1
foo(x, z for z in range(10), t, w)
^
SyntaxError: Generator expression must be parenthesized
becomes
>>> foo(x, z for z in range(10), t, w)
File "<stdin>", line 1
foo(x, z for z in range(10), t, w)
^^^^^^^^^^^^^^^^^^^^
SyntaxError: Generator expression must be parenthesized
diff --git a/Doc/library/exceptions.rst b/Doc/library/exceptions.rst
index f4f5c47..1b9a5fa 100644
--- a/Doc/library/exceptions.rst
+++ b/Doc/library/exceptions.rst
@@ -436,6 +436,18 @@
The source code text involved in the error.
+ .. attribute:: end_lineno
+
+ Which line number in the file the error occurred ends in. This is
+ 1-indexed: the first line in the file has a ``lineno`` of 1.
+
+ .. attribute:: end_offset
+
+ The column in the end line where the error occurred finishes. This is
+ 1-indexed: the first character in the line has an ``offset`` of 1.
+
+ .. versionchanged:: 3.10
+ Added the :attr:`end_lineno` and :attr:`end_offset` attributes.
.. exception:: IndentationError
diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst
index 67e03f2..86cf11f 100644
--- a/Doc/whatsnew/3.10.rst
+++ b/Doc/whatsnew/3.10.rst
@@ -171,6 +171,31 @@
(Contributed by Pablo Galindo in :issue:`42864` and Batuhan Taskaya in
:issue:`40176`.)
+:exc:`SyntaxError` exceptions raised by the intepreter will now highlight the
+full error range of the expression that consistutes the syntax error itself,
+instead of just where the problem is detected. In this way, instead of displaying
+(before Python 3.10):
+
+.. code-block:: python
+
+ >>> foo(x, z for z in range(10), t, w)
+ File "<stdin>", line 1
+ foo(x, z for z in range(10), t, w)
+ ^
+ SyntaxError: Generator expression must be parenthesized
+
+now Python 3.10 will display the exception as:
+
+.. code-block:: python
+
+ >>> foo(x, z for z in range(10), t, w)
+ File "<stdin>", line 1
+ foo(x, z for z in range(10), t, w)
+ ^^^^^^^^^^^^^^^^^^^^
+ SyntaxError: Generator expression must be parenthesized
+
+This improvement has been contributed by Pablo Galindo in :issue:`43914`.
+
A considerable amount of new specialized messages for :exc:`SyntaxError` exceptions
have been incorporated. Some of the most notable ones: