from types import prepare_class

def combine_meta(name, bases, namespace, **kwargs):
    metaclasses = []
    for base in bases:
        meta, ns, _ = prepare_class(name, (base,), kwargs)
        if meta is not type:
            if type(ns) is not type(namespace):
                if type(namespace) is not dict:
                    raise TypeError('metaclass conflict: '
                        'multiple custom namespaces defined.')
                ns.update(namespace)
                namespace = ns
            elif ns:
                namespace.update(ns)
            metaclasses = [other for other in metaclasses if not issubclass(meta, other)]
            if not any(issubclass(other, meta) for other in metaclasses):
                metaclasses.append(meta)
    if len(metaclasses) > 1:
        meta_name = '_'.join(meta.__name__ for meta in metaclasses)
        print(metaclasses)
        metaclass = type(meta_name, tuple(metaclasses), {})
    else:
        metaclass, = metaclasses or (type,)
    return metaclass(name, bases, namespace, **kwargs)

class M1(type):
    pass

class M2(M1):
    pass

class A(metaclass=M1):
    pass

class B(metaclass=M2):
    pass

class C(A, B, metaclass=combine_meta):
    pass

assert type(C) is M2

class C(B, A, metaclass=combine_meta):
    pass

assert type(C) is M2