Issue 28582: Invalid backslash syntax errors are not always accurate as to the location on the line where the error occurs (original) (raw)

See from , repeated here:

Seems the ^ pointer is not always correct. For example, in the function scope it's correct:

$ cat test.py def foo(): s = 'C:\Program Files\Microsoft'

$ python3.7 -W error test.py File "test.py", line 2 s = 'C:\Program Files\Microsoft' ^ SyntaxError: invalid escape sequence \P

On the other hand, top-level literals confuses the pointer:

$ cat test.py
s = 'C:\Program Files\Microsoft'

$ python3.7 -W error test.py File "test.py", line 1 s = 'C:\Program Files\Microsoft' ^ SyntaxError: invalid escape sequence \P

Is that expected?

I think there are actually two issues at play here:

  1. The caret is not compensated for indentation removed from the code. This is what Issue 25677 was originally about. The current patch there will ensure that the behaviour is always like the second (top-level) case, no matter what the indentation was.

  2. The caret points at the character before SyntaxError.offset. Sometimes the offset identifies the end of the erroneous syntax, and the caret makes sense, because it points at the end of an invalid word (or directly at an invalid character). But other times, such as the invalid escape sequence, offset points at the start of the invalid syntax, and the caret will point to the end of the previous valid syntax. This issue was brought up at the end of Issue 25677, but should probably be dealt with separately.

If you take the first case (indented function), and change the size of the indentation, you will see that the caret is no longer correct. It just happens that with four spaces, the two bugs kind of cancel each other out, and the positioning is actually better than it was designed to be :)