[IPython-user] [Python-Dev] a quit that actually quits

Walter Dörwald walter at livinglogic.de
Tue Jan 3 08:28:57 CST 2006

Ville Vainio wrote:

> On 1/3/06, Walter Dörwald <walter at livinglogic.de> wrote:
>>>BTW, is the curses even necessary for this task? Why not just dump the
>>>stuff directly to stdout?
>>That's another option of course. But moving backwards in the output is
>>impossible (or at least ackward) in this version.
> I think old versions of "more" did this tolerably... it doesn't look
> good on screen (because it scrolls down while you are actually moving
> up) but the ease of implementation (and fast redraw these days) eases
> the pain a bit.

OK, so should we pipe the data to more or implement our own 
ouput/keyboard handling?

>>Well if you want to give the user the option to go back to the first
>>object, you'd have to tee() the iterator before you fetch any objects
>>from it, which mean that you'd keep a list of all objects in memory
>>anyway. And when you do that, you can go straight to a list without
>>using itertools.tee().
> Not quite, you'll still fetch the upcoming items "lazily", so that you
> don't need to prefetch 1000000 lines from a long generator or choke on
> an infinite one...

With "all objects" I meant "all objects you've output so far". I.e. you 
only fetch more object once the user goes beyond the current last one.

>>But how would %page recognise which columns/attributes to display?
>>Furthermore I'd like to be able to manipulate this generator (filtering,
>>sorting, etc.). As an example take a look at
>>    http://www.livinglogic.de/Python/sh.py
> Yes, the filter idea is certainly interesting and useful.
>>This implements env (as a wrapper for os.environ) and pwd (as a wrapper
>>for the pwd module (if you're on Linux)). Just do a "from sh import *"
> The special case for es.environ might be a bit too specific - why not
> just do general wrapper for dicts and always use "key" and "val" for
> field names? Then you could do
> tabulatedict(os.environ) / contains(key='PY') / sort(val=True) / WalterPager

This can be done with the following filter that transforms a dictionary 
(well anything that has a iteritems()) into a browseable filter:

class tabulatedict(Filter):
    def operate(self, iterator):
       class dictentry(Object):
          __shattrs__ = ("key", "val")

          def __init__(self, key, val):
             self.key = key
             self.val = val

       for item in iterator.iteritems():
          yield dictentry(*item)

With this you can do:

 >>> os.environ / tabulatedict() / contains(key="HOME") / sort(key=False)
key        |val                |
HOME       |/var/home/walter   |
JAVA_HOME  |/opt/j2sdk1.4.1_02 |
ORACLE_HOME|/oracle/Client     |

    Walter Dörwald

More information about the IPython-user mailing list