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

Fernando Perez Fernando.Perez at colorado.edu
Mon Jan 2 10:55:36 CST 2006


Walter Dörwald wrote:
> 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.

Welcome :)

>>>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.

That's true: if you don't need/want all the ipython bells and whistles, 
code.InteractiveConsole is very simple, easy to use code, and you do have 
exact control over the behavior.

>>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.

You attribute far too much credit to ipython: the word 'design' may be 
uncomfortably stretched over ipython's code :)

> 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

This is an interesting idea, but I see a problem with it: the hooks control 
flow is determined by the return value of the hook.  This is OK for a hook, 
such as the display one, whose main purpose is I/O (i.e., a side-effect in 
functional programming lingo).  But many other hooks actually need to process 
their input and produce output, so unless we add everywhere in the call chain 
extra arguments to signify 'continue' vs "I'm done for this input", I am not 
sure how to make this work in a simple and generic manner.

So far, I've preferred to have users install their own hooks, which can 
optionally defer back to ipython's internal ones for input they don't want to 
handle:

def mydisplayhoook(arg):
   if isinstance(arg,int):
      do_whatever()
   else:
      ipython._display(arg)

For a concrete example of this, see how the pysh shell implements input 
filtering.  The prefilter_shell method here:

http://projects.scipy.org/ipython/ipython/file/ipython/trunk/IPython/Extensions/InterpreterExec.py

has the actual code.

But I'm quite interested in fleshing out this further, as it will be an 
important part of having a clean extension mechanism for future versions.

>>>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.

Got it, sorry for the initial misunderstanding.  Something like that could 
definitely be an interesting addition, and I've toyed with the idea of an 
_optional_ curses-based ipython.  This would allow us to offer true multiline 
editing, while still in a terminal (no gui toolkit needed).  Note, however, that:

a. programming curses is no fun, so I'm not sure this will ever evolve beyond 
idle idea

b. curses is not portable to win32, so this would have to remain optional (I 
want to make sure that the basic ipython remains very portable).

Thanks for the feedback,

f




More information about the IPython-user mailing list