[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Multiple inheritance, super() and changing signature

Ian Kelly <ian.g.kelly at> writes:

> Except that since we're discussing design for multiple inheritance,
> the positional argument "spam" is inappropriate. All arguments should
> be passed by keyword; the DolorSitAmet.__init__ method cannot be
> certain that LoremIpsum will be the next class in the MRO, and the
> actual next class might not expect spam to be the first positional
> argument.

You're right. That also allows us to stop handling unknown positional

This does make it troublesome to design the function signature though,
and I can see why people balk at how to deal with the semantics of
?super? in Python 2::

    class LoremIpsum(object):
        def __init__(self, **kwargs):
            spam = kwargs.pop('spam')
            super(LoremIpsum, self).__init__(**kwargs)

    class DolorSitAmet(LoremIpsum):
        def __init__(self, **kwargs):
            self.eggs = kwargs.pop('eggs')
            self.beans = kwargs.pop('beans')
            super(DolorSitAmet, self).__init__(**kwargs)

That's awful :-( because the initialiser's signature no longer shows any
sign of which parameters matter for this class.

It also sucks to need ?dict.pop('name')?, instead of just ?name?.

Keyword-only parameters make this easier and clearer::

    class LoremIpsum:
        def __init__(self, *, spam, **kwargs):
            spam = kwargs.pop('spam')

    class DolorSitAmet(LoremIpsum):
        def __init__(self, *, eggs=4, beans=None, **kwargs):
            self.eggs = eggs
            self.beans = beans

I guess that's yet another reason to advocate Python 3 for all new code.

 \          ?One time a cop pulled me over for running a stop sign. He |
  `\        said, ?Didn't you see the stop sign?? I said, ?Yeah, but I |
_o__)                don't believe everything I read.?? ?Steven Wright |
Ben Finney