[Edu-sig] interactive vs compiled from file

Dethe Elza delza at livingcode.org
Sat Aug 4 02:24:00 CEST 2007


On 3-Aug-07, at 4:38 PM, kirby urner wrote:

> Not sure we should call this "echoing" as what's happening
> is an expression is being evaluated.

No, the expression is being evaluated either way, all we are doing is  
turning off the default echoing of the expression result (and the  
side-effect of assigning the expression result to the underscore  
variable).

> It just so happens that the eval of a quoted string returns
> itself  whereas "some expression with %s" % "substitution"
> would actually evaluate to non-echo.

What the normal displayhook does is echo the result of non-None  
expressions, and assign those to _.  What the little hack I showed  
did is replace that default behaviour with a no-op, a do-nothing.   
Whether this is a good idea or not is a different matter, but let's  
be clear about what's happening.

> kirby at dell:~$ python ./repl.py
>>>> 'THIS IS A STRING'
> THIS IS A STRING
>>>> [x*x for x in range(10)]
> [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>>> "1-2-3 %s" % "testing"
> 1-2-3 testing
>
> Would one turn off all of the above, or just the first eval-print?

Not sure what you're asking.  None of the evals are being changed,  
just the default echoing.  If you then want to print you could either  
assign it to a variable and print that, or pass the whole expression  
through print.  Again, I'm not saying this is a good thing, but it is  
more consistent with how the non-interactive runtime works.

> What would be the point of a broken shell, vs explaining that
> Python, like many languages, features a REPL (read-eval-print loop)?

Well, it might be useful to show learners that a) this is different  
from what you should expect when you run your program, and b) it is  
not magic.  For instance:

 >>> ''
''
 >>> 'abc'
'abc'
 >>> 'my name is %s' % 'Dethe'
'my name is Dethe'
 >>> import sys
 >>> def noecho(value): pass
...
 >>> def echo(value):
...     print value
...
 >>> def echo_and_assign(value):
...     print value
...     global _
...     _ = value
...
 >>> sys.displayhook = noecho
 >>> 'abc'
 >>> sys.displayhook = echo
 >>> 'abc'
abc
 >>> _
<built-in function displayhook>
 >>> sys.displayhook = echo_and_assign
 >>>

Now we've re-implemented the default behaviour (modulo any edge cases  
it handles that I've missed).  And if we want to completely get back  
to the default, after playing around with the displayhook, that's  
easy too:

 >>> sys.displayhook = sys.__displayhook__ # always returns  
displayhook back to system default

Or if we want something to happen every time we eval a line in the  
interpreter:

 >>> def enhanced_display(value):
...     sys.__displayhook__(value)
...     do_my_stuff()
...
 >>> sys.displayhook = enhanced_display

It's all fun and games, until someone loses their ribs.  ;-)

--Dethe

Language is what something becomes when you think in it -- Robert  
Bringhurst




More information about the Edu-sig mailing list