On Fri, 17 Jul 2009 02:01:49 +0100, Ben Finney <ben+pyt...@benfinney.id.au> wrote:

Howdy all,

The following is a common idiom::

    class FooGonk(object):
        def frobnicate(self):
            """ Frobnicate this gonk. """
            basic_implementation(self.wobble)

    class BarGonk(FooGonk):
        def frobnicate(self):
            special_implementation(self.warble)

The docstring for ‘FooGonk.frobnicate’ is, intentionally, perfectly
applicable to the ‘BarGonk.frobnicate’ method also. Yet in overriding
the method, the original docstring is not associated with it.

Ideally there would be a way to specify that the docstring should be
inherited. The best I can come up with is::

    class BarGonk(FooGonk):
        def frobnicate(self):
            special_implementation(self.warble)
        frobnicate.__doc__ = FooGonk.frobnicate.__doc__

but that violates DRY (the association between BarGonk and FooGonk is
being repeated),

Not really.  Consider the case of BarGonk being a subclass of FooGonk
and BazGonk; which docstring would you wish to inherit?

puts the docstring assignment awkwardly after the end
of the method instead of at the beginning where docstrings normally go,
and reads poorly besides.

Sounds like a job for a decorator!

(This is probably unbelievably ugly and unwise, since I don't use
decorators at all often.)

def copydoc(cls):
    def _fn(fn):
        if fn.__name__ in cls.__dict__:
            fn.__doc__ = cls.__dict__[fn.__name__].__doc__
        return fn
    return _fn

class BarGonk(FooGonk):
    @copydoc(FooGonk)
    def frobnicate(self):
        special_implementation(self.warble)

--
Rhodri James *-* Wildebeest Herder to the Masses
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to