[issue16669] Docstrings for namedtuple
Peter Otten
report at bugs.python.org
Mon Apr 27 12:00:17 CEST 2015
Peter Otten added the comment:
Here's a variant that builds on your code, but makes for a nicer API. Single-line docstrings can be passed along with the attribute name, and with namedtuple.with_docstrings(... all info required to build the class ...) from a user perspective the factory looks like a class method:
from functools import partial
from collections import namedtuple
def _with_docstrings(cls, typename, field_names_with_doc,
*, verbose=False, rename=False, doc=None):
field_names = []
field_docs = []
if isinstance(field_names_with_doc, str):
field_names_with_doc = [
line for line in field_names_with_doc.splitlines() if line.strip()]
for item in field_names_with_doc:
if isinstance(item, str):
item = item.split(None, 1)
if len(item) == 1:
[fieldname] = item
fielddoc = None
else:
fieldname, fielddoc = item
field_names.append(fieldname)
field_docs.append(fielddoc)
nt = cls(typename, field_names, verbose=verbose, rename=rename)
for fieldname, fielddoc in zip(field_names, field_docs):
if fielddoc is not None:
new_property = property(getattr(nt, fieldname), doc=fielddoc)
setattr(nt, fieldname, new_property)
if doc is not None:
nt.__doc__ = doc
return nt
namedtuple.with_docstrings = partial(_with_docstrings, namedtuple)
if __name__ == "__main__":
Point = namedtuple.with_docstrings("Point", "x abscissa\ny ordinate")
Address = namedtuple.with_docstrings(
"Address",
"""
name Surname
first_name First name
city
email Email address
""")
Whatever = namedtuple.with_docstrings(
"Whatever",
[("foo", "doc for\n foo"),
("bar", "doc for bar"),
"baz"],
doc="""The Whatever class.
Example for a namedtuple with multiline docstrings for its attributes.""")
----------
nosy: +peter.otten
_______________________________________
Python tracker <report at bugs.python.org>
<http://bugs.python.org/issue16669>
_______________________________________
More information about the Python-bugs-list
mailing list