Rickard - 1 year ago 86
Python Question

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?

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 """
__slots__ = ()
``````

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):
__slots__ = ()
__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
``````
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download