Skip to content

Instantly share code, notes, and snippets.

@markrwilliams
Last active December 20, 2015 20:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save markrwilliams/6191539 to your computer and use it in GitHub Desktop.
Save markrwilliams/6191539 to your computer and use it in GitHub Desktop.
def merge(classes_list):
merged = [None]
while classes_list:
for classes in classes_list:
head = classes[0]
tails = [c[1:] for c in classes_list]
if not any(head in tail for tail in tails):
if head != merged[-1]:
merged.append(head)
for classes in classes_list:
if head in classes:
classes.remove(head)
if not classes:
classes_list.remove(classes)
break
else:
raise RuntimeError('Conflict! {}'.format(classes_list))
return merged[1:]
def c3(c):
linearized = [c3(b) for b in c.__bases__ if b]
if c.__bases__:
linearized.append(list(c.__bases__))
return [c] + merge(linearized)
O = object
class F(O): pass
class E(O): pass
class D(O): pass
class C(D,F): pass
class B(D,E): pass
class A(B,C): pass
print c3(A)
print c3(A) == A.mro()
O = object
class F(O): pass
class E(O): pass
class D(O): pass
class C(D,F): pass
class B(E,D): pass
class A(B,C): pass
print c3(A)
print c3(A) == A.mro()
class FakeC(object):
def __init__(self, *bases):
self.__bases__ = bases
O = object
class X(O): pass
class Y(O): pass
class A(X,Y): pass
class B(Y,X): pass
print c3(A)
print c3(A) == A.mro()
print c3(FakeC(A, B))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment