[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
- Previous message: [Python-3000] Octal
- Next message: [Python-3000] Compiling the PEP 3115 metaclass syntax
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
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/)
- Previous message: [Python-3000] Octal
- Next message: [Python-3000] Compiling the PEP 3115 metaclass syntax
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]