git.net

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

Multiple inheritance, super() and changing signature


Ian Kelly <ian.g.kelly at gmail.com> 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
arguments.

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')
            do_something_important_with(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')
            do_something_important_with(spam)
            super().__init__(**kwargs)

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

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