Search code examples
pythonipythondispatchdocstring

Is there a way to generate IPython docstrings on the fly?


I like that IPython will fetch docstrings if I type foo.bar?

However, I may sometimes build the foo.bar method dynamically, using foo.__getattr__. I could conceivably also generate a docstring dynamically, perhaps in a magic method like foo.__getdoc__.

Does IPython provide any mechanism for doing this, such that it would discover and display docstrings built on the fly?


Solution

  • That has nothing to do with IPython, IPython just reads the __doc__ attribute of an object. If you dynamically create your objects in the __getattr__ method you should just set their __doc__ attribute as well and everything will work correctly in IPython.

    Here is an example:

    class A(object):
        def __init__(self, name):
            self.name = name
    
        def __repr__(self):
            return 'A[%s]' % self.name
    
    class Test(object):
        def __getattr__(self, name):
            a = A(name)
            a.__doc__ = 'My a documentation'
            return a
    
    In [11]: t = Test()
    In [12]: t.foo
    A[foo]
    In [13]: t.foo?
    Type:       A
    String Form:A[foo]
    Docstring:  My a documentation