Prev: Confusing SyntaxError while entering non-indented code in interactiveinterpreter on continuation line.
Next: can't get python 2.5.5 to work on mac os x 10.4.11
From: Patrick Maupin on 25 Apr 2010 16:45 On Apr 25, 3:31 pm, Colin Howell <colin.d.how...(a)gmail.com> wrote: > [I originally sent this to python-help; the volunteer who responded > thought it was OK to repost it here.] > > I'm sure this has been discussed somewhere before, but I can't find it > in the Python issue tracker. The following behavior from the > interactive interpreter is rather confusing. (I've seen this behavior > both under Python 2.6.5 on 32-bit Windows XP, installed from the > standard Windows binary installer available from python.org, and under > Python 2.4.3 on a Fedora Core 4 32-bit x86 Linux system.) > > The following do-nothing code is valid Python: > > if True: > pass > pass > > A script file containing it will execute without error when passed to > the Python interpreter from the command line, or when run from an IDLE > edit window using the Run Module command (F5) key. > > However, if the interpreter is run in interactive mode from the > command line, and I attempt to enter the same code from the > interactive prompt as follows, I get a SyntaxError at the outer "pass" > statement: > > >>> if True: > > ... pass > ... pass > File "<stdin>", line 3 > pass > ^ > SyntaxError: invalid syntax > > The inner "pass" statement can be indented using spaces or with the > Tab key; it doesn't matter. The problem is that I entered the outer > "pass" statement on the second continuation line, rather than simply > hitting return and waiting for a new primary prompt. But since the > second continuation line is not indented unless you enter the > indentation yourself, this is actually an easy mistake to make. One > might think the parser will recognize that the inner block's > indentation has been removed on the new line and that the line > therefore represents a new statement. > > The same thing can happen in IDLE, except that IDLE automatically > indents the continuation line and doesn't print a secondary prompt. > But if you delete IDLE's indentation on the next continuation line and > enter a new statement, you get the same SyntaxError as described > above. > > What led me to this behavior? Example 6.1 on the following page from > Dive Into Python: > > http://diveintopython.org/file_handling/index.html > > In this case, the code is a try-except statement, followed by a print. > Note that the print is entered on a continuation line, which led me to > carelessly try the same thing and then puzzle about it for quite a > while before it finally hit me what I had been doing. > > I know that Dive Into Python is quite old and there have been many > improvements in the language since, but I still think this gotcha > needs to be looked at, at least to add a warning about it in the FAQ > or tutorial, or to make the nature of the syntax error more obvious. I agree that this is an easy mistake to make. It's particularly easy to do when cutting and pasting into an interactive shell. I don't think you could call this an error on the part of the python interpreter, but it seems like it would be a great feature enhancement to make the interpreter work more consistently. After all, you can happily unindent to any level except the far left: >>> if a: .... if b: .... c .... d .... e File "<stdin>", line 5 e ^ SyntaxError: invalid syntax Regards, Pat
From: John Bokma on 25 Apr 2010 18:21
Colin Howell <colin.d.howell(a)gmail.com> writes: > I know that Dive Into Python is quite old and there have been many > improvements in the language since, FYI There is a Dive Into Python 3. -- John Bokma j3b Hacking & Hiking in Mexico - http://johnbokma.com/ http://castleamber.com/ - Perl & Python Development |