[Python-checkins] r54539 - in python/trunk: Lib/string.py Misc/NEWS Objects/typeobject.c

Jim Jewett jimjjewett at gmail.com
Fri Mar 23 18:48:52 CET 2007


(Please note that most replies should trim at least one list from the Cc)

On 3/23/07, guido.van.rossum <python-checkins at python.org> wrote:
> Note: without the change to string.py, lots of spurious warnings happen.
> What's going on there?

I assume it was a defensive measure for subclasses of both Template
and X, where X has its own metaclass (which might have an __init__
that shouldn't be ignored).

This is where cooperative classes get ugly.  You could argue that the
"correct" code is to not bother making the super call if it would go
all the way to object (or even type), but there isn't a good way to
spell that.

> +        # A super call makes no sense since type() doesn't define __init__().
> +        # (Or does it? And should type.__init__() accept three args?)
> +        # super(_TemplateMetaclass, cls).__init__(name, bases, dct)

In this particular case, you could define a type.__init__ that did
nothing.  (If the signature were wrong, type.__new__ would have
already caught it.  If __new__ and __init__ are seeing something
different, then the change was probably intentional.)

The problem isn't really limited to type.__init__ though.  You'll
sometimes see similar patterns for __del__, close, save, etc.  The
main difference is that they have to either catch an error or check
first, since object doesn't have an implementation of those methods.
object.__init__ doesn't really do anything either, except check for
errors.  Getting rid of it should have the same effect as complaining
about parameters.

The ideal solution (discussion of which probably ought to stay on
python-ideas) might be to replace object.__init__ with some sort of
PlaceHolder object  that raises an error *unless* called through a
cooperative super.  This PlaceHolder would also be useful for
AbstractBaseClasses/Interfaces.  PlaceHolder still wouldn't deal with
the original concern of verifying that all arguments had already been
stripped and used; but the ABCs might be able to.

-jJ

> Modified: python/trunk/Lib/string.py
> ==============================================================================
> --- python/trunk/Lib/string.py  (original)
> +++ python/trunk/Lib/string.py  Fri Mar 23 05:58:42 2007
> @@ -108,7 +108,9 @@
>      """
>
>      def __init__(cls, name, bases, dct):
> -        super(_TemplateMetaclass, cls).__init__(name, bases, dct)
> +        # A super call makes no sense since type() doesn't define __init__().
> +        # (Or does it? And should type.__init__() accept three args?)
> +        # super(_TemplateMetaclass, cls).__init__(name, bases, dct)
>          if 'pattern' in dct:
>              pattern = cls.pattern
>          else:


More information about the Python-checkins mailing list