Ian Kelly <ian.g.ke...@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 -- https://mail.python.org/mailman/listinfo/python-list