[Python-Dev] Adding types.build_class for 3.3 (original) (raw)

Nick Coghlan ncoghlan at gmail.com
Wed May 9 03:10:56 CEST 2012


On Wed, May 9, 2012 at 8:37 AM, Tres Seaver <tseaver at palladion.com> wrote:

No, the "mcl" in the call is just the designated metaclass - the actual metaclass of the resulting class definition may be something different. That's why this is a separate method from mcl.new. Why not make it a static method, if there is no notion of a useful 'cls' argument?

We need the explicitly declared metaclass as well as the bases in order to determine the correct metaclass.

As a static method, the invocation would look like:

type.build_class(mcl, bases, keywords, exec_body)

Since mcl will always be an instance of type in 3.x (due to all classes being subtypes of object), it makes more sense to just make it a class method and invoke the method on the declared metaclass:

mcl.build_class(bases, keywords, exec_body)

The following assertion does not hold reliably:

cls = mcl.build_class(bases, keywords, exec_body)
assert type(cls) == mcl # Not guaranteed

Instead, the invariant that holds is the weaker assertion:

cls = mcl.build_class(bases, keywords, exec_body)
assert isinstance(cls, mcl)

This is due to the fact that one of the bases may specify that the actual metaclass is a subtype of mcl rather than mcl itself.

Cheers, Nick.

-- Nick Coghlan   |   ncoghlan at gmail.com   |   Brisbane, Australia



More information about the Python-Dev mailing list