How to override the doc of an object instance.

Maric Michaud maric at
Wed Jun 21 13:27:47 EDT 2006

Le Mercredi 21 Juin 2006 17:00, Paul McGuire a écrit :
> No need to, just assign your special docstrings to w.x.__doc__, and print
> w.x.__doc__.  Instances that have special docstrings will print their
> instance-specific versions; instances without instance-specific docstrings
> will print the class-level version.  See below.

I think this is about to make IPython find the proper docstring of properties 
without modifying existing code.

> >>> z.__doc__  = "instance-level docstring, just for z"
> >>> z.__doc__
> 'instance-level docstring, just for z'
> >>> zz = W()
> >>> print zz.__doc__
> Class-level docstring for W
> >>> print z.__doc__
> instance-level docstring, just for z

Won't work for properties, as z.prop.__doc__ is in fact z._prop.__doc__, so 
future assignment to prop qil lose the docstring.

Le Mercredi 21 Juin 2006 18:32, David Huard a écrit :
> I looked into the internals of IPython and I can't say I understood much...

This function wil do the job, not roughly tested but seems ok, call it at any 
moment (startup ?) in the IPython shell.

def make_pinfo() :
    """replace the standard magic_pinfo of itpython
    This one will insert __class__. before the last element
    if it is a property."""

    if not hasattr(__IPYTHON__, 'old_pinfo') :
        __IPYTHON__._old_pinfo = __IPYTHON__.magic_pinfo

        def new_pinfo(obj) :
            """obj param is the string typed in the interpreter, ie a.b.c
            it will be evaluated in magic_pinfo"""
             path = obj.split('.')
             if len(path) == 1 :
                 return __IPYTHON__._old_pinfo(obj)
             else :
                 new_eval_string = '.'.join(path[:-1])
                 # get the last attribute by the mean of the __class__ of its 
                 target = __IPYTHON__.user_ns[path[0]] # user_ns is the 
globals of the interpreter
                 for attr in path[1:-1] :
                     target=getattr(target, attr)
                 target = getattr(target.__class__, path[-1], None)

                 if isinstance(target, property) :
                     new_eval_string += '.__class__'
                 return __IPYTHON__._old_pinfo(new_eval_string + '.' + 

        __IPYTHON__.magic_pinfo = new_pinfo

Hope this help.



Maric Michaud

Aristote -
3 place des tapis
69004 Lyon
Tel: +33 426 880 097

More information about the Python-list mailing list