duplicate docstrings
Felix Wiemann
Felix.Wiemann at gmx.net
Sat Feb 19 08:04:13 EST 2005
Steven Bethard wrote:
> class C(object):
> def foo(self):
> """Foo things"""
> ...
>
> class D(object):
> def foo(self):
> """Foo things"""
> ...
>
> It bothers me that I'm basically writing the same docstrings multiple
> times. I guess what I really want to do is just write the docstrings
> for the interface I'm describing, and only supply docstrings in the
> classes when they need to differ from the interface docstrings.
>
> Is there a good way to do this? If it's necessary, I can have C and D
> inherit from another class...
Use a common interface type and a metaclass which copies method
docstrings from base classes:
------------------------------------------------------------------------------
#!/usr/bin/env python
import inspect
class DocstringMetaclass(type):
"""Copy method docstrings."""
def __init__(cls, *args):
super(DocstringMetaclass, cls).__init__(*args)
for name, method in cls.__dict__.iteritems():
# method is a function, not a method, so we use isfunction().
if not inspect.isfunction(method) or method.__doc__ is not None:
continue
for c in cls.mro():
if hasattr(c, name):
m = getattr(c, name)
if inspect.ismethod(m) and m.__doc__ is not None:
method.__doc__ = m.__doc__
break
class Interface(object):
__metaclass__ = DocstringMetaclass
def foo(self):
"""Foo things"""
def bar(self):
"""Bar things"""
def baz(self):
"""Baz things in a C manner"""
class Implementation(Interface):
def foo(self):
pass
def bar(self):
pass
def baz(self):
pass
print Implementation.foo.__doc__
print Implementation.bar.__doc__
print Implementation.baz.__doc__
------------------------------------------------------------------------------
Output:
Foo things
Bar things
Baz things in a C manner
--
Felix Wiemann -- http://www.ososo.de/
More information about the Python-list
mailing list