[Python-3000] PEP for Metaclasses in Python 3000

Josiah Carlson jcarlson at uci.edu
Tue Mar 13 22:26:48 CET 2007


"Guido van Rossum" <guido at python.org> wrote:
> On 3/13/07, Greg Ewing <greg.ewing at canterbury.ac.nz> wrote:
> > I'm a bit worried that class headers are going to become
> > rather cluttered if we start putting all sorts of stuff
> > in there.
> >
> > E.g. are you intending to put __slots__ there? It makes
> > sense, but it could lead to some rather long and
> > unwieldy class headers.
> 
> It makes sense to put slots there, doesn't it? I'm not too worried
> about the long class headers; a formatting convention can do wonders
> here.

I agree that formatting can do wonders, but it smells a bit like the
discussion that was had way back when we were discussing function
decorators.  If I remember correctly, one reason why decorators didn't
end up in the function signature was *because* it makes the function
signature unruly in the case of many decorators.  While class headers
are significantly more rare than function or method definitions, I can't
help but think that some sort of 'pre-decorator' syntax wouldn't look a
bit better.  Say something like @@(*args, **kwargs).  For a shorter
example, it doesn't look much (if any) better...

    class F(implements=(I1, I2)):
        ...

vs.

    @@(implements=(I1, I2))
    class F:
        ...

But in slightly longer examples, I think that the looks are
significantly improved...

    class Foo(base1, base2, *otherbases, metaclass=mymeta,
        private=True, **kwargs):
        ...

vs.

    @@(metaclass=mymeta, private=True, **kwargs)
    class Foo(base1, base2, *otherbases):
        ...

The 'pre-decorator' (which only makes sense for classes) could serve as
the location where all **kwargs are passed to the __prepare__ method on
the provided metaclass, with the class header allowing *args, which are
provided to both __prepare__ and whatever method is called on the
metaclass.


 - Josiah



More information about the Python-3000 mailing list