Python 2 and 3 Compatibility

sage.misc.six.with_metaclass(meta, *bases)

Create a base class with a metaclass.

TESTS:

sage: from sage.misc.six import with_metaclass
sage: class Meta(type): pass
sage: class X(with_metaclass(Meta)): pass
sage: type(X) is Meta
True
sage: issubclass(X, object)
True
sage: class Base(object): pass
sage: class X(with_metaclass(Meta, Base)): pass
sage: type(X) is Meta
True
sage: issubclass(X, Base)
True
sage: class Base2(object): pass
sage: class X(with_metaclass(Meta, Base, Base2)): pass
sage: type(X) is Meta
True
sage: issubclass(X, Base)
True
sage: issubclass(X, Base2)
True
sage: X.__mro__ == (X, Base, Base2, object)
True

Check that trac ticket #18503 is fixed, i.e. that with_metaclass works with cdef’ed metaclasses:

sage: from sage.misc.classcall_metaclass import ClasscallMetaclass
sage: class X(with_metaclass(ClasscallMetaclass)): pass
sage: type(X) is ClasscallMetaclass
True
sage: X.__mro__ == (X, object)
True