[Python-3000] PEP for Metaclasses in Python 3000

Nick Coghlan ncoghlan at gmail.com
Tue Mar 13 10:16:42 CET 2007


Guido van Rossum wrote:
> On 3/9/07, Steven Bethard <steven.bethard at gmail.com> wrote:
>> <bikeshed>
>> I'd rather __metacreate__ be called something like __createdict__,
>> __creationdict__, __metadict__, __getmetadict__, etc. where it's
>> clearer that the purpose is to create a dict object.
>> </bikeshed>
> 
> Agreed; there's no need that the attribute name contains the word
> 'meta' again, that's already implied in it being an attribute of the
> metaclass.

Along similar lines, I'd be marginally happier with:

   class Bob(meta=Planet): pass

over what is currently proposed in the PEP. Repeating the 'class' part 
within a single line feels redundant.

> On 3/9/07, Brett Cannon <brett at python.org> wrote:
>> Do the keywords have to follow the metaclass keyword, or is order
>> irrelevant?  While order makes sense, it would be a new precedent for
>> keyword arguments to have an important order.
> 
> I'd like the syntax between () to be identical to that for a function
> call, i.e. including *args and **kwds. That way the cognitive load for
> the user is the smallest. Sorting out the semantics of the keywords is
> purely a runtime activity anywaty.

I like this idea.

I think the signature of the method that creates the namespace 
dictionary requires some further thought though:

  - is it intended to typically be a static method or a class method of 
the metaclass? (as it will be called before __new__, an instance method 
of the metaclass wouldn't make sense)

  - is the metaclass passed in to the namespace creation function as a 
normal keyword argument, or is it automatically removed by the 
interpreter? (note that implementing it as a class method would still 
allow access to the actual metaclass)

  - if the metaclass is derived rather than passed in explicitly, is the 
'meta' argument still passed in to the namespace creation function?

  - what's the actual signature of the new function?

The answers to these will be somewhat intertwined - if the 'meta' 
keyword argument is always going to be passed in to the function, then 
it makes more sense to use a static method in the typical case. If the 
meta keyword is stripped (or only provided when passed in explicitly), 
then a class method is needed in order to reliably get at the metaclass 
itself.


Cheers,
Nick.

-- 
Nick Coghlan   |   ncoghlan at gmail.com   |   Brisbane, Australia
---------------------------------------------------------------
             http://www.boredomandlaziness.org


More information about the Python-3000 mailing list