pythondocstringnamedtuple

Adding docstrings to namedtuples?


Is it possible to add a documentation string to a namedtuple in an easy manner?

I tried

from collections import namedtuple

Point = namedtuple("Point", ["x", "y"])
"""
A point in 2D space
"""

# Yet another test

"""
A(nother) point in 2D space
"""
Point2 = namedtuple("Point2", ["x", "y"])

print Point.__doc__ # -> "Point(x, y)"
print Point2.__doc__ # -> "Point2(x, y)"

but that doesn't cut it. Is it possible to do in some other way?


Solution

  • You can achieve this by creating a simple, empty wrapper class around the returned value from namedtuple. Contents of a file I created (nt.py):

    from collections import namedtuple
    
    Point_ = namedtuple("Point", ["x", "y"])
    
    class Point(Point_):
        """ A point in 2d space """
        pass
    

    Then in the Python REPL:

    >>> print nt.Point.__doc__
     A point in 2d space 
    

    Or you could do:

    >>> help(nt.Point)  # which outputs...
    
    Help on class Point in module nt:
    
    class Point(Point)
     |  A point in 2d space
     |  
     |  Method resolution order:
     |      Point
     |      Point
     |      __builtin__.tuple
     |      __builtin__.object
     ...
    

    If you don't like doing that by hand every time, it's trivial to write a sort-of factory function to do this:

    def NamedTupleWithDocstring(docstring, *ntargs):
        nt = namedtuple(*ntargs)
        class NT(nt):
            __doc__ = docstring
        return NT
    
    Point3D = NamedTupleWithDocstring("A point in 3d space", "Point3d", ["x", "y", "z"])
    
    p3 = Point3D(1,2,3)
    
    print p3.__doc__
    

    which outputs:

    A point in 3d space