[Tutor] Help with simple text book example that doesn't work!!!

Hugo Arts hugo.yoshi at gmail.com
Sun Apr 4 16:05:10 CEST 2010


On Sun, Apr 4, 2010 at 3:15 PM, Brian Drwecki <drwecki at gmail.com> wrote:
>
> As for the exact error code....here it is.
>
>>>>
> while True:
>     reply = raw_input('Enter text:')
>     if reply == 'stop':
>         break
>     elif not reply.isdigit(  ):
>         print 'Bad!' * 8
>     else:
>         print int(reply) ** 2
> print 'bye'
> SyntaxError: invalid syntax  (note it highlights the print code)...
>
> This works!!!
>>>> print'bye'
> bye
>>>>
>

the interactive interpreter is a comparatively simple machine.
Notably, it expects you to type only a single statement at a time. It
may be a compound statement or a simple statement, but it must be only
one statement. Your code, at the top level consists of two statements,
a 'while' statement (which is compound) and a print statement. The
interpreter expects only a single statement, and complains when it
finds the second one:


In [2]: if True:
   ...:     print "inside statement one"
   ...: print "inside statement two"
------------------------------------------------------------
   File "<ipython console>", line 3
     print "inside statement two"
         ^
SyntaxError: invalid syntax

In [3]:

If you embed these two statements inside a single compound statement
(whether that is a loop, conditional, function, whatever) the
interpreter will stop complaining again, since the top-level statement
again consists of only a single statement:

In [8]: if True:
   ...:     if True:
   ...:         print "sub-statement one"
   ...:     print "sub-statement two"
   ...:
sub-statement one
sub-statement two
In [9]:

Note that when interpreting a python script, there is no such
limitation, and multiple top-level statements are perfectly fine.

I haven't read the source, but my guess is that when parsing python
source code, the parser uses a StatementList AST node as the root to
parse a list of statements, while the interactive interpreter doesn't
create this AST node. That's why it's limited to a single statement at
a time.

HTH,
Hugo


More information about the Tutor mailing list