[Python-3000] Compiling the PEP 3115 metaclass syntax (original) (raw)

Guido van Rossum guido at python.org
Thu Mar 15 02:26:14 CET 2007


The PEP proposes that the class statement accepts keyword arguments, *args, and **kwds syntax as well as positional bases. This is a bit messy to compile and execute, but we already have this, of course, in the code for calling regular functions.

So I think it would be acceptable to this into a call to a new (hidden) built-in function, named build_class. Then that this class definition:

class C(A, B, metaclass=M, other=42, *more_bases, *more_kwds): ...

would translate into this:

C = build_class(, 'C', A, B, metaclass=M, other=42, *more_bases, *more_kwds)

where is a function object for the class body. (It's a slightly different function than currently; the current function returns the locals, while the new one takes the locals as an argument; instead of a LOAD_LOCALS opcode we need a STORE_LOCALS opcode.)

Then build_class could be roughly like this (but implemented in C):

def build_class(func, name, *bases, metaclass=None, **kwds): if metaclass is None: metaclass = extract_metaclass(bases) # may raise an exception prepare = getattr(metaclass, "prepare", None) if prepare: locals = prepare(name, bases, **kwds) else: locals = {} func(locals) return metaclass(name, bases, locals, **kwds)

What do folks think?

-- --Guido van Rossum (home page: http://www.python.org/~guido/)



More information about the Python-3000 mailing list