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

Walter Dörwald walter at livinglogic.de
Mon Jan 2 07:57:09 CST 2006


Fernando Perez wrote:

> [ switching to my normal address, else I'll miss your messages.  I'm 
> also cc-ing the ipython list for this discussion: I prefer to keep such 
> matters there, for archival/search purposes, for the benefit of others, 
> and for my own organizational sanity ]

OK, I'm subscribed to the list now.

> Walter Dörwald wrote:
>> Fernando Perez wrote:
> 
>>> And you're on your way to re-writing ipython:
>>
>> I *am* on my way to rewriting ipython actually! ;)
> 
> It's a long road :)

I won't need every feature that IPython offers, and once the step from 
using displayhook+excepthook to subclassing code.InteractiveConsole is 
done, the rest seems to be pretty straightforward.

>>> I also started it with "let's add a cool hack to sys.ps1 and
>>> sys.displayhook in 10 minutes".  Now we're at 18000 lines of python, 
>>> a 70
>>> page manual, and growing suport for remote distributed interactive
>>> computing, a new scientific computing GUI, and more  :)
>>
>> That's what scares me. I've been using a simple displayhook and 
>> excepthook
>> for years now. Later I've tried out ipython and liked some of it's
>> features, but it was to much bl%ck m%gic for my taste and I found ipython
>> hard to extend, so I went back to using my own stuff and began writing my
>> own shell based on code.InteractiveConsole. (It's currently at about 300
>> lines of code)
> 
> IPython is easy to extend, it's just hard to know where to start :)

I fear that this is more a feature of Python than of the way IPython is 
designed.

> The 
> problem is that the current code grew 'organically' (to put it nicely), 
> and the internals are a hideous spaghetti mess.  There are extension 
> points for many things, but you'd mostly have to ask me on the list for 
> details on how to get started.   A few things, though, are well 
> documented and with examples in the manual (new %magics, aliases, and 
> input filtering).
> 
> As I rework ipython, one of my goals is to make a decent writeup of its 
> public API, so that users can know exactly where to look for extension 
> points.  Some of this is documented here:
> 
> http://projects.scipy.org/ipython/ipython/wiki/RefactoringIPython

I like the decision to go with plain Python files for configuration.
Also being able to extend IPython with hooks written in Python sounds good.

> (hooks section - due to a Trac bug, the links in the Table of contents 
> don't work, just scroll down).
> 
>>> If you like this kind of thing, by all means join in: I can use all the
>>> helping hands I can get.
>>
>> What I've added to my shell is that the debugger uses the same stack dump
>> when navigating the stack frames as does the except hook.
>>
>> When I added a new way of doing colored terminal output to my packages, I
>> noticed that it isn't easy to extend ipython's output, it's either
>> pprint.pprint or the default displayhook. I already know Python, so 
>> let me
>> extend ipython in Python. What I would like to be able to do is the
>> following: def mydisplayhook(stream, obj): if isinstance(obj,
>> myspecialclass): stream.writeln(...) # my special output return True # 
>> tell
>> ipython that output has been done return False # tell ipython to give the
>> next displayhook a chance
>>
>> import ipython ipython.adddisplayhook(mydisplayhook)
> 
> Yes, that's basically what the future API will look like.  Currently, 
> you'll need to overwrite, using new.instancemethod, the
> 
> __IPYTHON__.outputcache.display
> 
> method, that's all.

OK, but that replaces the complete output function. What I'd like to 
have is a way to replace the output function only for certain types of 
objects. For this I've been using the following decorator that allows 
installing a function as a "cooperative displayhook":

def asdisplayhook(function):
    oldhook = sys.displayhook
    def hook(obj):
       result = function(obj)
       if result is not None and not result:
          result = oldhook(obj)
          return result
    hook.__dict__.update(function.__dict__)
    hook.__doc__ = function.__doc__
    hook.__name__ = function.__name__
    sys.displayhook = hook
    return function

Installing a hook that only changes the output of ints then works like this:

@asdisplayhook
def inthook(obj):
    if isinstance(obj, int):
       print "%d (0%o, 0x%x)" % (obj, obj, obj)
       return True
    return False

>> Another idea (that I haven't started to implement yet) is a curses-based
>> browser for tabular data that works with generators. I.e. if we had
>> generators pwd(), grp(), environ() etc. that yield object with the
>> appropriate attributes and a browse function would display the data as a
>> curses based table. Paging would be done by fetching the next 40 (or so)
>> objects from the generator etc. This might make a good frontend for 
>> browse
>> SQL result too. If you're interested, I can send you some of my code once
>> I'm back from vacation and have access to my machine again (on 1/3)
> 
> I'm not a database guy, but this is partly why this discussion is best 
> held on-list:

This has nothing to do with databases per se. Just think of the output 
of %whos, which would be a candidate for this functionality.

> there may be other users here who are into that line of 
> work.  I encourage you to subscribe (you have to for posting, spam was 
> otherwise out of control), the volume is quite low and spam is zero.

I'm subscribed now.

Bye,
    Walter Dörwald




More information about the IPython-user mailing list