Created on 2016-11-01 18:23 by eric.smith, last changed 2016-12-10 23:47 by martin.panter. This issue is now closed.
See msg279799 from issue28128, 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?
This is known issue. See issue25677.
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 :)