[Python-ideas] inheriting docstrings

Eric Snow ericsnowcurrently at gmail.com
Fri Jun 10 23:39:12 CEST 2011


On Fri, Jun 10, 2011 at 1:04 AM, Greg Ewing <greg.ewing at canterbury.ac.nz> wrote:
> Maybe the best thing would be for the inherited docstring
> to get put into a different property, such as __basedoc__.
> Then tools that examine docstrings can decide for themselves
> whether using inherited docstrings makes sense.

Another idea that I like, that someone suggested on python-list [1],
is using the empty string to indicate that you want a docstring to be
inherited. Here's an approximate implementation using a metaclass:
 class DocDescriptor:
 # as a non-data descriptor
 # but how to make it a data descriptor for the class?
 def __init__(self, docstring):
 self.docstring = docstring
 def __get__(self, obj, cls):
 if self.docstring != '':
 return self.docstring
 return next(c.__doc__ for c in cls.__mro__[1:] if c.__doc__) or ''
 class DocMethod:
 def __init__(self, f, cls):
 self.f = f
 self.cls = cls
 def __getattribute__(self, name):
 if name == '__doc__':
 return object.__getattribute__(self, '__doc__')
 f = object.__getattribute__(self, 'f')
 return getattr(f, name)
 @property
 def __doc__(self):
 f = object.__getattribute__(self, 'f')
 cls = object.__getattribute__(self, 'cls')
 if f.__doc__ != '':
 return f.__doc__
 for base in cls.__mro__:
 basefunc = base.__dict__.get(self.f.__name__)
 if not basefunc:
 continue
 docstring = getattr(basefunc, '__doc__', None)
 if not docstring:
 continue
 return docstring
 return ''
 @__doc__.setter
 def __doc__(self, value):
 object.__getattribute__(self, 'f').__doc__ = value
 class Meta(type):
 def __init__(cls, name, bases, namespace):
 docstring = namespace.get('__doc__')
 cls.__doc__ = DocDescriptor(docstring)
 for attrname, obj in namespace.items():
 if isinstance(obj, FunctionType):
 setattr(cls, attrname, DocMethod(obj, cls))
-eric
[1] http://mail.python.org/pipermail/python-list/2011-June/1274123.html


More information about the Python-ideas mailing list

AltStyle によって変換されたページ (->オリジナル) /