[IPython-dev] getdoc hook
Fernando.Perez at colorado.edu
Fri Apr 8 05:24:54 EDT 2005
Frédéric Mantegazza wrote:
> I found a way to get Pyro remote object docstrings :o) So I'm trying to
> implement this in IPython. But I have some questions:
> 1) (not really a IPython specific question) As I have to modify a little bit
> the OInspect.getdoc() function, I'm trying to rebind this function to mine,
> but it does not work :o( How can I do this ? Here is my code:
> import PyMAD.client.ipython.IPython.OInspect
> def getdoc(obj):
> PyMAD.client.ipython.IPython.OInspect.getdoc = getdoc
> Where am I wrong ?
I'm not really sure why it's not working, what you are doing looks perfectly
reasonable to me.
> Fernando, could it be possible to add a hook to rebind this function in a
> better way ?
Well, this is not really an ipython internal method which is hookable, it's
just a plain function in a library (the OInspect module). So what you are
doing is about as simple a rebind as I can imagine (though I don't understand
why it's failing in your case, sorry).
> It would also be nice to have a hook to change the whole
> getdoc behaviour. I mean, I would like to use my own Inspector class (at
> least to be able to overide some parts of it).
Well, you can use your own inspector simply by setting:
__IPYTHON__.inspector = your_inspector_instance
> 2) Why is the getdoc() function always called, even when I don't use the
> 'obj?' syntax ?
Because in the input evaluation loop, while I find what you typed (to make
auto-execution decisions and the like), once the object is found I fish out in
passing the docstring. A lot of the machinery that does many of the nice
things in ipython needs to know quite a bit about the objects referenced by
names at the command line, so I tried to centralize this collection of
information in one place. The actual routine is _ofind() in Magic.py (that
probably belongs somewhere else like iplib.py, really).
> 3) Is it possible make difference in 'obj.?' and 'obj.??' syntaxes at the
> getdoc() level ? If not, where is it handled ?
No. getdoc() gets passed a true object, not the input line which the user
typed. By the time getdoc is called, we've long forgotten the user input. If
you need to mess with that kind of thing, you need to put traps very early on
in the line processing, that's what custom prefilters are for. Note that
obj.? doesn't work:
In : code.?
Object `code.` not found.
because the dot is taken as part of the name. If you want things to work with
that dot, you'll have to do custom handling at the prefilter level, since
'foo.' can never be a valid python object name.
More information about the IPython-dev