Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

REPL with multiple function definitions

19 views
Skip to first unread message

Rob Cliffe

unread,
Jun 26, 2022, 6:14:57 PM6/26/22
to
This 2-line program

def f(): pass
def g(): pass

runs silently (no Exception).  But:

23:07:02 c:\>python
Python 3.8.3 (tags/v3.8.3:6f8c832, May 13 2020, 22:20:19) [MSC v.1925 32
bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> def f(): pass
... def g(): pass
  File "<stdin>", line 2
    def g(): pass
    ^
SyntaxError: invalid syntax
>>>

Is there a good reason for this?
Thanks
Rob Cliffe

Jon Ribbens

unread,
Jun 26, 2022, 6:22:50 PM6/26/22
to
For some reason, the REPL can't cope with one-line blocks like that.
If you put a blank line after each one-block line then it will work.

Chris Angelico

unread,
Jun 26, 2022, 6:37:31 PM6/26/22
to
On Mon, 27 Jun 2022 at 08:15, Rob Cliffe via Python-list
<pytho...@python.org> wrote:
>
> This 2-line program
>
> def f(): pass
> def g(): pass
>
> runs silently (no Exception). But:
>
> 23:07:02 c:\>python
> Python 3.8.3 (tags/v3.8.3:6f8c832, May 13 2020, 22:20:19) [MSC v.1925 32
> bit (Intel)] on win32
> Type "help", "copyright", "credits" or "license" for more information.
> >>> def f(): pass
> ... def g(): pass
> File "<stdin>", line 2
> def g(): pass
> ^
> SyntaxError: invalid syntax
> >>>
>
> Is there a good reason for this?

The REPL compiles one statement at a time. A file is allowed to
contain multiple statements.

ChrisA

Roel Schroeven

unread,
Jun 26, 2022, 6:38:18 PM6/26/22
to
Rob Cliffe via Python-list schreef op 27/06/2022 om 0:14:
> This 2-line program
>
> def f(): pass
> def g(): pass
>
> runs silently (no Exception).  But:
>
> 23:07:02 c:\>python
> Python 3.8.3 (tags/v3.8.3:6f8c832, May 13 2020, 22:20:19) [MSC v.1925 32
> bit (Intel)] on win32
> Type "help", "copyright", "credits" or "license" for more information.
> >>> def f(): pass
> ... def g(): pass
>   File "<stdin>", line 2
>     def g(): pass
>     ^
> SyntaxError: invalid syntax
> >>>
>
> Is there a good reason for this?
The REPL requires an extra empty line to indicate the end of multi-line
constructs. You can see it by the prompt: as long as the REPL prints
'... '  as prompt, that means it puts everything you type in the same
multi-line construct. To enter a new multi-line construct (such as a
function definition, a for-loop, an if-statement, ...), press enter
directly at the prompt; the REPL should than use '>>> ' as the prompt again.

(Alternatives like IPython (https://ipython.readthedocs.io/en/stable/)
are a bit more loose regarding how to enter multi-line constructs)

--
"Iceland is the place you go to remind yourself that planet Earth is a
machine... and that all organic life that has ever existed amounts to a greasy
film that has survived on the exterior of that machine thanks to furious
improvisation."
-- Sam Hughes, Ra

Rob Cliffe

unread,
Jun 28, 2022, 8:59:09 PM6/28/22
to
It's actually not to do with 1-line blocks, just attempting to define 2
functions "at once":


22:27:23 C:\>python
Python 3.8.3 (tags/v3.8.3:6f8c832, May 13 2020, 22:20:19) [MSC v.1925 32
bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> def f():
...     return 42
... def g():
  File "<stdin>", line 3
    def g():
    ^
SyntaxError: invalid syntax
>>>

But you are right that adding a blank line after the first function
definition solves the "problem".
Rob Cliffe


Chris Angelico

unread,
Jun 28, 2022, 9:14:03 PM6/28/22
to
On Wed, 29 Jun 2022 at 11:00, Rob Cliffe via Python-list
<pytho...@python.org> wrote:
>
> On 26/06/2022 23:22, Jon Ribbens via Python-list wrote:
> It's actually not to do with 1-line blocks, just attempting to define 2
> functions "at once":
>
>
> 22:27:23 C:\>python
> Python 3.8.3 (tags/v3.8.3:6f8c832, May 13 2020, 22:20:19) [MSC v.1925 32
> bit (Intel)] on win32
> Type "help", "copyright", "credits" or "license" for more information.
> >>> def f():
> ... return 42
> ... def g():
> File "<stdin>", line 3
> def g():
> ^
> SyntaxError: invalid syntax
> >>>
>
> But you are right that adding a blank line after the first function
> definition solves the "problem".

And if you have something where you want to copy and paste multiple
statements, there are a few ways to do it:

1) Put "if 1:" at the top. That makes it a single block, so you can
paste in as much as you like, as long as the only blank line is at the
end.

2) Put the code into a file and then use "python3 -i setup.py". That
runs all the code, then drops you into the REPL in that context.

3) Put the code into a file, and inside the REPL, "from setup import
*". Unlike option 2, this can be done after the beginning of the
session. Downside: editing setup.py and reimporting won't apply your
changes.

ChrisA
0 new messages