[Python-Dev] patching pydoc?

Terry Reedy tjreedy at udel.edu
Fri Jul 28 20:29:50 CEST 2006


"tomer filiba" <tomerfiliba at gmail.com> wrote in message 
news:1d85506f0607280635q3a693682l230c7821dc6f408f at mail.gmail.com...
...
> therefore, i would like to split this behavior into two parts:
> * render_doc - a function that returns the document text
> * doc - a function that calls render_doc and sends it to the pager
>
> this way no existing code breaks (no existing function signatures
> are changed) and i gain help on remote objects.
> i hope people would be in favor, as it's not such a big change anyway.
> is it possible to add to 2.5?

Giving the amount of hair-tearing over uuid and __index__, this seems like 
an especially bad day to ask for a new-feature variance in a time of 
feature freeze ;-).

Some quick questions:
* I presume you gain the new functionality by directly calling the 
factored-out render_doc and printing thru your own pager.  Does everyone?
* Would making pager() a parameter of doc() make sense?
* Is pager() the only part of the original doc() that can generate 
ImportError, ErrorDuringImport?  If not, the try/except should be in 
render_doc also or instead.
* Why generalize the doc() signature?  Bad calls will be traced as caught 
in render_doc instead of doc.  Couldn't that potentially break a bad_call 
test?

Terry Jan Reedy

> this is the code of pydoc, starting at line 1457
>
> <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
> def doc(thing, title='Python Library Documentation: %s', forceload=0):
>    """Display text documentation, given an object or a path to an 
> object."""
>    try:
>        object, name = resolve(thing, forceload)
>        desc = describe(object)
>        module = inspect.getmodule(object)
>        if name and '.' in name:
>            desc += ' in ' + name[:name.rfind('.')]
>        elif module and module is not object:
>            desc += ' in module ' + module.__name__
>        if not (inspect.ismodule(object) or
>                inspect.isclass(object) or
>                inspect.isroutine(object) or
>                isinstance(object, property)):
>            # If the passed object is a piece of data or an instance,
>            # document its available methods instead of its value.
>            object = type(object)
>            desc += ' object'
>        pager(title % desc + '\n\n' + text.document(object, name))
>    except (ImportError, ErrorDuringImport), value:
>        print value
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>
> this is the suggested code
>
> <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
> def render_doc(thing, title='Python Library Documentation: %s', 
> forceload=0):
>    """generate the text"""
>    object, name = resolve(thing, forceload)
>    desc = describe(object)
>    module = inspect.getmodule(object)
>    if name and '.' in name:
>        desc += ' in ' + name[:name.rfind('.')]
>    elif module and module is not object:
>        desc += ' in module ' + module.__name__
>    if not (inspect.ismodule(object) or
>            inspect.isclass(object) or
>            inspect.isroutine(object) or
>            isinstance(object, property)):
>        # If the passed object is a piece of data or an instance,
>        # document its available methods instead of its value.
>        object = type(object)
>        desc += ' object'
>    return title % desc + '\n\n' + text.document(object, name)
>
> def doc(*args, **kwargs):
>    """Display text documentation, given an object or a path to an 
> object."""
>    try:
>        text = render_doc(*args, **kwargs)
>        pager(text)
>    except (ImportError, ErrorDuringImport), value:
>        print value
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> _______________________________________________
> Python-Dev mailing list
> Python-Dev at python.org
> http://mail.python.org/mailman/listinfo/python-dev
> Unsubscribe: 
> http://mail.python.org/mailman/options/python-dev/python-python-dev%40m.gmane.org
> 





More information about the Python-Dev mailing list