tolomea tolomea - 7 months ago 13
Python Question

Where does Python's pydoc help function get its content?

I have a lot of callable objects and they all have the

__doc__
string correctly filled out, but running help on them produces the help for their class instead of help based on
__doc__
.

I want to change it so that running help on them produces customized help that looks essentially like what I would get if they were actual functions instead of instances of a class that implements
__call__
.

In code, I'd like to make the output of this:

class myCallable:
def __init__(self, doc):
self.__doc__ = doc

def __call__(self):
# do some stuff
pass

myFunc = myCallable("some doco text")
help(myFunc)


Look more like the output of this:

def myFunc():
"some doco text"
# do some stuff
pass

help(myFunc)

Answer

The help function (implemented in the pydoc module) isn't prepared to find per-instance docstrings. I took a quick look through the module to see if there was a way to provide explicit help, but there doesn't seem to be. It uses the inspect module to determine what kind of thing it is, and your myFunc doesn't look like a function, it looks like an instance. So pydoc prints help about the instance's class instead.

It'd be nice if similar to __doc__ you could add a __help__ attribute, but there's no support for that.

I hesitate to suggest it, but your best bet might be to define a new help function:

old_help = help
def help(thing):
    if hasattr(thing, '__help__'):
        print thing.__help__
    else:
        old_help(thing)

and then put a __help__ attribute on your instances:

class myCallable:
    def __init__(self, doc):
        self.__doc__ = doc
        self.__help__ = doc
Comments