[Python-Dev] What is the design purpose of metaclasses vs code generating decorators? (was Re: PEP 557: Data Classes)
lkb.teichmann at gmail.com
Sat Oct 14 10:37:13 EDT 2017
> Things that will not work if Enum does not have a metaclass:
> list(EnumClass) -> list of enum members
> dir(EnumClass) -> custom list of "interesting" items
> len(EnumClass) -> number of members
> member in EnumClass -> True or False
> - protection from adding, deleting, and changing members
> - guards against reusing the same name twice
> - possible to have properties and members with the same name (i.e. "value"
> and "name")
In current Python this is true. But if we would go down the route of
PEP 560 (which I just found, I wasn't involved in its discussion),
then we could just add all the needed functionality to classes.
I would do it slightly different than proposed in PEP 560:
classmethods are very similar to methods on a metaclass. They are just
not called by the special method machinery. I propose that the
following is possible:
>>> class Spam:
... def __getitem__(self, item):
... return "Ham"
this should solve most of your usecases.
When thinking about how an automatic metaclass combiner would look
like, I realized that it should ideally just reproduce the class mro,
just with metaclasses. So if a class has an mro of [A, B, C, object],
its metaclass should have an mro of unique_everseen([type(A), type(B),
type(C), type]). But in this case, why add this layer at all? Just
give the class the ability to do everything a metaclass could do,
using mechanisms like @classmethod, and we're done.
More information about the Python-Dev