Skip to content
Snippets Groups Projects
Commit 451876f3 authored by Benjamin Fischer's avatar Benjamin Fischer
Browse files

added class rebasing function

parent 3b4d2f21
No related branches found
No related tags found
No related merge requests found
...@@ -44,3 +44,50 @@ def pin(loc, *skip): ...@@ -44,3 +44,50 @@ def pin(loc, *skip):
) )
} }
) )
def rebase(obj, want, dont=(), name=None, ns=None):
if isinstance(obj, type):
cls = obj
obj = None
else:
assert obj is not None
cls = type(obj)
if not isinstance(want, (list, tuple)):
want = (want,)
if not isinstance(dont, (list, tuple)):
dont = (dont,)
assert want or dont
want = tuple(w for w in want if w not in cls.__bases__)
if name is None:
name = cls.__name__
for d in dont:
name = name.replace(d.__name__, "", 1)
for w in want:
if w.__name__ not in name:
name += w.__name__
bases = []
for base in cls.__bases__:
if issubclass(base, dont):
bases.extend(want)
want = ()
else:
bases.append(base)
if want:
bases.extend(want)
bases = tuple(bases)
if cls.__bases__ != bases:
if ns is None:
ns = dict(cls.__dict__)
ns.pop("__module__", 1)
if obj is None:
cls = type(name, bases, ns)
else:
obj.__class__ = type(name, bases, ns)
return cls if obj is None else obj
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment