Python › Multiple Inheritance & MRO

How does the C3 linearization algorithm compute a class's MRO?

Advanced

Answer

C3 linearization merges the MROs of a class's parents plus the list of parents itself, using a rule that a class only appears in the result once all classes that must precede it (per each parent's own MRO and per the declared base-class order) have already been placed. It guarantees three properties: subclasses precede base classes, the local precedence order (order bases are listed) is preserved, and it's monotonic -- the same relative order holds across all related class hierarchies. If no valid linearization exists, Python raises TypeError: Cannot create a consistent MRO.
class A: pass
class B(A): pass
class C(A): pass
class D(B, C): pass

print([c.__name__ for c in D.__mro__])
# ['D', 'B', 'C', 'A', 'object'] -- computed via C3, not simple depth-first
Real-world example Debugging an unexpected method resolution in a complex mixin hierarchy, a developer manually traces the C3 merge rules to understand exactly why one class's method takes precedence over another's.

Common follow-ups: What causes a 'Cannot create a consistent MRO' error?;How does local precedence order affect the final linearization?