28 "Redundant items are repeated items or items in the original skipset."
29 if skipset
is None: skipset = set()
31 if item
not in skipset:
37 skipset = {
type(types)}
38 for meta
in metaclasses:
39 skipset.update(inspect.getmro(meta)[1:])
47 memoized_metaclasses_map = {}
52 metas = left_metas + tuple(map(type, bases)) + right_metas
56 if needed_metas
in memoized_metaclasses_map:
57 return memoized_metaclasses_map[needed_metas]
59 elif not needed_metas:
61 elif len(needed_metas) == 1:
62 meta = needed_metas[0]
64 elif needed_metas == bases:
65 raise TypeError(
"Incompatible root metatypes", needed_metas)
67 metaname =
'_' +
''.join([m.__name__
for m
in needed_metas])
68 meta =
classmaker()(metaname, needed_metas, {})
69 memoized_metaclasses_map[needed_metas] = meta
74 def make_class(name, bases, adict):
76 return metaclass(name, bases, adict)
def skip_redundant(iterable, skipset=None)
preliminary: two utility functions #####################
def classmaker(left_metas=(), right_metas=())
def remove_redundant(metaclasses)
def get_noconflict_metaclass(bases, left_metas, right_metas)