classification
Title: Make traceback module's formatting of SyntaxError more similar to system formatting
Type: Stage: resolved
Components: Versions: Python 3.9
process
Status: closed Resolution: fixed
Dependencies: Superseder:
Assigned To: Nosy List: gvanrossum, lys.nikolaou, miss-islington, pablogsal
Priority: normal Keywords: patch

Created on 2020-05-13 04:18 by gvanrossum, last changed 2020-05-17 23:52 by gvanrossum. This issue is now closed.

Pull Requests
URL Status Linked Edit
PR 20072 closed gvanrossum, 2020-05-13 17:10
Messages (6)
msg368759 - (view) Author: Guido van Rossum (gvanrossum) * (Python committer) Date: 2020-05-13 04:18
The traceback module formats several edge cases of SyntaxError different than CPython's default formatting.

- There's an off-by-one error if the column offset (printed as a caret) points past the last character (example: 'a +='). The clipping is wrong and the caret points to the last character.

- If the offset is <= 0, it appears the code silently adds the length of the source text.

- The system formatting suppresses the caret if the offset is -1; the only way to suppress the caret with the traceback module is setting the offset to None (or setting the source text to None).

- The system formatting can position the caret way past the end of the source text; the traceback module clips (also see the first bullet).

I propose to make the traceback module behave the same way as the system module in all cases. I also propose to make both suppress the caret if the offset is <= 0. Finally I propose to make the system formatting limit the offset to just past the end of the source text.

I propose not to bother changing anything in 3.8 or before.
msg368853 - (view) Author: Lysandros Nikolaou (lys.nikolaou) * (Python committer) Date: 2020-05-14 17:39
Agreed on everything.

One thing I don't really understand is if you propose to also strip trailing whitespace. Does "limit the offset to just past the end of the source text" include whitespace or not?

For example, the linked PR does not change this behavior:

➜  cpython git:(pr/20072) ./python
Python 3.9.0a6+ (heads/pr/20072:6df7662ca5, May 14 2020, 20:37:50) 
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> compile('1 +      ', '<string>', 'exec')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1
    1 +      
             ^
SyntaxError: invalid syntax

Should we clip just past the end of `1 +` here?
msg368856 - (view) Author: Guido van Rossum (gvanrossum) * (Python committer) Date: 2020-05-14 17:54
My current PR does not strip trailing whitespace. It only strips a single trailing newline (since this is usually but not always present, and we don't want to its presence to cause an extra blank line, nor do we want its absence to cause the text line and the caret line to be run together).
msg368857 - (view) Author: Guido van Rossum (gvanrossum) * (Python committer) Date: 2020-05-14 17:55
(And, to be clear, I don't *want* to strip trailing spaces.)
msg368859 - (view) Author: Lysandros Nikolaou (lys.nikolaou) * (Python committer) Date: 2020-05-14 17:56
Understood.
msg368917 - (view) Author: miss-islington (miss-islington) Date: 2020-05-15 02:22
New changeset 15bc9ab301d73f20bff47a12ef05326feb40f797 by Guido van Rossum in branch 'master':
bpo-40612: Fix SyntaxError edge cases in traceback formatting (GH-20072)
https://github.com/python/cpython/commit/15bc9ab301d73f20bff47a12ef05326feb40f797
History
Date User Action Args
2020-05-17 23:52:37gvanrossumsetstatus: open -> closed
resolution: fixed
stage: patch review -> resolved
2020-05-15 02:22:55miss-islingtonsetnosy: + miss-islington
messages: + msg368917
2020-05-14 17:56:40lys.nikolaousetmessages: + msg368859
2020-05-14 17:55:36gvanrossumsetmessages: + msg368857
2020-05-14 17:54:47gvanrossumsetmessages: + msg368856
2020-05-14 17:39:46lys.nikolaousetmessages: + msg368853
2020-05-13 17:10:22gvanrossumsetkeywords: + patch
stage: patch review
pull_requests: + pull_request19378
2020-05-13 04:18:55gvanrossumcreate