[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
- Previous message: [Python-Dev] Adding types.build_class for 3.3
- Next message: [Python-Dev] Adding types.build_class for 3.3
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
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
- Previous message: [Python-Dev] Adding types.build_class for 3.3
- Next message: [Python-Dev] Adding types.build_class for 3.3
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]