Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Where does help() find the info in Python?

I discovered the built-in help() recently that prints some information for a module, function, method, class, etc. But where exactly does it find the information it shows? Python docs don't give a single hint about this.

>>> import base64
>>> help(base64)
Help on module base64:

NAME
    base64 - RFC 3548: Base16, Base32, Base64 Data Encodings

FILE
    /usr/lib/python2.7/base64.py
..
like image 783
Pithikos Avatar asked Feb 23 '26 23:02

Pithikos


2 Answers

If you simply do, help(help), you will get

Help on _Helper in module site object:

class _Helper(__builtin__.object)
 |  Define the builtin 'help'.
 |  This is a wrapper around pydoc.help (with a twist).
 |  
 |  Methods defined here:
 |  
 |  __call__(self, *args, **kwds)
 |  
 |  __repr__(self)
 |  
 |  ----------------------------------------------------------------------
 |  Data descriptors defined here:
 |  
 |  __dict__
 |      dictionary for instance variables (if defined)
 |  
 |  __weakref__
 |      list of weak references to the object (if defined)

basically, help gets its input from pydoc.help. Quoting, pydoc documentation,

For modules, classes, functions and methods, the displayed documentation is derived from the docstring (i.e. the __doc__ attribute) of the object, and recursively of its documentable members. If there is no docstring, pydoc tries to obtain a description from the block of comment lines just above the definition of the class, function or method in the source file, or at the top of the module (see inspect.getcomments()).

The built-in function help() invokes the online help system in the interactive interpreter, which uses pydoc to generate its documentation as text on the console.


But where exactly does it find the information it shows?

The quoted bold text above answers this question.

like image 133
thefourtheye Avatar answered Feb 26 '26 11:02

thefourtheye


It is in site.py, if you use help.__class__ you will see it is site._Helper which is just a wrapper around pydoc.help :

In [1]: help.__class__
Out[1]: site._Helper

_Helper class from site.py:

class _Helper(object):
    """Define the builtin 'help'.
    This is a wrapper around pydoc.help (with a twist).

    """

    def __repr__(self):
        return "Type help() for interactive help, " \
               "or help(object) for help about object."
    def __call__(self, *args, **kwds):
        import pydoc
        return pydoc.help(*args, **kwds)

def sethelper():
    __builtin__.help = _Helper() 

help(object) is equivalent to __builtin__.help(object) which passes the object to pydoc.help.

like image 40
Padraic Cunningham Avatar answered Feb 26 '26 13:02

Padraic Cunningham