classification
Title: Unhelpful syntax error when expression spans multiple lines
Type: Stage: resolved
Components: Versions: Python 3.9
process
Status: closed Resolution: duplicate
Dependencies: Superseder: Line number of SyntaxError
View: 40813
Assigned To: Nosy List: aroberge, gvanrossum, lazka, lys.nikolaou, pablogsal
Priority: normal Keywords:

Created on 2020-12-05 15:10 by lazka, last changed 2020-12-15 18:50 by gvanrossum. This issue is now closed.

Messages (6)
msg382566 - (view) Author: Christoph Reiter (lazka) * Date: 2020-12-05 15:10
I don't know if the bug tracker is the right place for this, please point me to the right place if not.

Someone faced to the following code (simplified example here) and asked for help:

```
if 3:
    if 1:
        print(((123))

if 2:
    print(123)
```

This results in the following error:

```
File "error.py", line 5
  if 2:
      ^
SyntaxError: invalid syntax
```

which is very confusing to users not familiar with generator expressions.

I'm wondering if python could improve syntax errors in this case by adding more context, like point to where it started parsing the current thing and where it gave up instead to just the later.
msg382893 - (view) Author: Andre Roberge (aroberge) * Date: 2020-12-11 22:25
I suspect that the Python parser cannot easily be changed to given any other message. Replace the colon by "else" and add one more closing parenthesis and you have a valid Python program.  So, is it a matter of an unclosed parenthesis, or not using "else" ? ....



If you want possible additional help in such situations, you can try to use the third-party package friendly-traceback which gives the following information for this case (I put your code in a file named "ignore.py")

====
Traceback (most recent call last):
  File "ignore.py", line 5
    if 2:
        ^
SyntaxError: invalid syntax

    A `SyntaxError` occurs when Python cannot understand your code.

    Python could not understand the code in the file
    'ignore.py'
    beyond the location indicated by --> and ^.

       2:     if 1:
       3:         print(((123))
       4:
    -->5: if 2:
              ^
       6:     print(123)

        I make an effort below to guess what caused the problem
        but I might guess incorrectly.

        The opening parenthesis `(` on line 3 is not closed.

            3:         print(((123))
                            ^
msg382894 - (view) Author: Christoph Reiter (lazka) * Date: 2020-12-11 23:50
I would expect Python to print the current statement up to the error instead of just the last line:

```
File "error.py", line 3-5
          print(((123))

  if 2:
      ^
```

This would solve this case nicely while in the common case still show one line as before.
msg383023 - (view) Author: Lysandros Nikolaou (lys.nikolaou) * (Python committer) Date: 2020-12-14 23:35
Thanks for opening an issue here, Christoph. This is the right place to discuss this.

Indeed the parser is pretty dumb when reporting errors. In the technical sense the colon is the right thing to point to, since it's the first token that's not grammatically correct. Of course, it's somewhat misleading that it points to a line that *seems* correct, but that probably as good as we can do with the parser's current error reporting mechanisms.

Showing more that one lines would indeed solve this specific case, but implementing this is also difficult and I don't think it's worth it for such an edge case.

Guido, Pablo, your views on this?
msg383049 - (view) Author: Pablo Galindo Salgado (pablogsal) * (Python committer) Date: 2020-12-15 13:05
I concur, handling also multi-line constructs is tricky and I would prefer not to implement some hack for specific situations because my experience is that balancing that with other things Is tricky. As Lysandros mentioned, the parser reports correctly the location of the error as indentation is non important inside parentheses and the code there could be an expression or the begging of a generator.

On the other hand we could think if we have a way of detecting of a syntax error occurs in the context of an unclosed parentheses and maybe do something about it, but I have no idea still how many false negatives could appear.
msg383090 - (view) Author: Guido van Rossum (gvanrossum) * (Python committer) Date: 2020-12-15 18:50
I think something should probably be done about this, but opening another tracker issue is not the way to make progress here. So I am closing the issue. It will happen in due time. No need to have more open issues.
History
Date User Action Args
2020-12-15 18:50:56gvanrossumsetstatus: open -> closed

messages: + msg383090
stage: resolved
2020-12-15 13:05:06pablogsalsetmessages: + msg383049
2020-12-14 23:35:53lys.nikolaousetnosy: + gvanrossum, lys.nikolaou, pablogsal
messages: + msg383023
2020-12-11 23:50:15lazkasetmessages: + msg382894
2020-12-11 22:25:18arobergesetnosy: + aroberge
messages: + msg382893
2020-12-05 16:50:56iritkatrielsetsuperseder: Line number of SyntaxError
resolution: duplicate
2020-12-05 15:10:38lazkacreate