[Python-3000] Metaclasses in Python 3000: Draft 2
Talin
talin at acm.org
Wed Mar 14 21:07:58 CET 2007
Guido van Rossum wrote:
> On 3/14/07, Talin <talin at acm.org> wrote:
>> PEP: xxx
>> Title: Metaclasses in Python 3000
>
> Checked in as PEP 3115. I fixed the two typos that were noted so far
> (missing comma and inconsistency in name of first arg to __prepare__;
> I renamed the latter metacls) and cleaned up one case of extra
> whitespace (.append( key ) -> .append(key)). Now on to the content:
>
>> def prepare_class(name, *bases, metaclass=type, **kwargs):
>> prepare = getattr(metaclass, '__prepare__', None)
>> if prepare is not None:
>> return prepare(name, bases, **kwargs)
>> else:
>> return dict()
>
> This is missing the extraction of the metaclass default from the
> bases. It's probably okay to default metaclass to None and add this
> code to the body:
>
> if metaclass is None:
> metaclass = compute_default_metaclass(bases)
>
>> type. It does not need to implement the full dictionary interface;
>> only the ability to insert items and retrieve them are
>> required. (Note: double check that this is true).
>
> As was mentioned, getitem, setitem and delitem are used. No other APIs
> are, unless the dict is accessed via locals(), or unless dir() is
> used. IMO it's up to the prepare function to provide the features that
> it wants to support; if it doesn't want to support deletions, that is
> between the metaclass and the users; the language spec doesn't have to
> say anything about this.
>
>> # The custom dictionary
>> class member_table(dict):
>> def __init__(self):
>
> <style-nit> Despite this just being an example, I'd like for the
> member_table class to be defined outside the OrderedClass class. it
> also probably ought to have a conforming name, i.e. MemberTable.
> </style-nit>
>
>> Another good suggestion was to simply use an ordered dict for all
>> classes, and skip the whole 'custom dict' mechanism. This was based
>> on the observation that most use cases for a custom dict were for
>> the purposes of preserving order information. However, this idea has
>> two drawbacks, first because it means that an ordered dict
>> implementation would have to be added to the set of built-in types
>> in Python, and second because it would impose a slight speed (and
>> complexity) penalty on all class declarations.
>
> I think this rebuttal isn't strong enough; I'm sure there *will* be
> use cases where a custom prepare method can solve a problem that a
> standard ordered dict couldn't.
This all looks good to me - I think I still have permission to check in
changes to the PEPs dir, want me to go ahead and make the changes directly?
-- Talin
More information about the Python-3000
mailing list