Search code examples
pythonintrospectionpydoc

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)

Solution

  • 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