On Apr 1, 10:21 am, Ed Leafe <[EMAIL PROTECTED]> wrote:

> On Apr 1, 2008, at 8:43 AM, George Sakkis wrote:
> > Pehaps, at least as long as you make sure that all superclasses have a
> > compatible signature - which in practice typically means accept
> > arbitrary *args and **kwargs in every class in the hierarchy like your
> > example. Good luck figuring out what's wrong if it's not used
> > consistently.
>
>         See my comment above. If you do not know what you're doing, you
> shouldn't be doing it. This is not the fault of super(); it's the
> fault of a poor programmer. And I used generic *args and **kwargs in
> the method sig since I was using made-up class names and methods.
> Would you have reacted more favorably if I had used (self, foo, bar)
> instead?

No, that was exactly my point; with a non-generic signature like
(self, foo, bar), it's a matter of time until some subclass breaks it.
Non-trivial hierarchies with all __init__ having compatible signatures
is not typical in my experience, but they have to be compatible to be
used correctly with super. Here is the conclusion from the second
article I linked:

'''
If you do use super, here are some best practices:

    * Use it consistently, and document that you use it, as it is part
of the external interface for your class, like it or not.
    * Never call super with anything but the exact arguments you
received, unless you really know what you're doing.
    * When you use it on methods whose acceptable arguments can be
altered on a subclass via addition of more optional arguments, always
accept *args, **kw, and call super like "super(MyClass,
self).currentmethod(alltheargsideclared, *args, **kwargs)". If you
don't do this, forbid addition of optional arguments in subclasses.
    * Never use positional arguments in __init__ or __new__. Always
use keyword args, and always call them as keywords, and always pass
all keywords on to super.
'''

> > In a sentence, it's better than nothing but worse than anything.
>
>         I guess I must be the world's most amazing Python developer, as I've
> used super() extensively for years without ever suffering any of the
> pitfalls you and others describe.

Some people use the same argument for explicit memory management in C/C
++. Sure, it can be done, but that doesn't make it elegant or trivial.
When experts like Michele Simionato find super() tricky enough to
write an article about it, that says something.

George
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to