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. > [EMAIL PROTECTED]:~$ 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 _______________________________________________ Edu-sig mailing list [email protected] http://mail.python.org/mailman/listinfo/edu-sig
