[Python-Dev] Re: my proposals about mros (was: perplexed by mro)

Guido van Rossum guido@python.org
Fri, 04 Oct 2002 11:15:53 -0400


[Guido]
> > If Samuele agrees that the naive algorithm works better, I'll try
> > to make it so in 2.3.

[Samuele]
> after cooking up the substitution example, I'm quite conviced that
> 2.2 mro is the worst of our options: it produces easely
> counterintuitive results, and if the conflict notion it needs is the
> one I think, it is the most prone to reject hierarchies or in case
> we ignore conflict to produce very odd results.

I don't disagree.

> So IMO our options are:

> *) use the naive algo: it is easy to explain (the algorithm) but we
> should live with the fact that it is not monotonic and I don't think
> it produces the most natural results (because it considers what is
> encoutered at the end of a dfs traversal, instead of what is at the
> beginning)

Sadly, true.

> *) adopt C3:

> (1) C3 is monotonic (it takes and merges respecting them the mros of
>     the superclasses, but in parallel, non sequentially like the
>     current 2.2 mro algo)

> (2) it respects also the inheritance lists of all superclasses; the
>     paper I cited claims that is something intuitively expected, and
>     I tend to agree.

> (3) it has another property, that basically enforces that, when this
>     does not conflicts with (1) and (2), the dfs order is respected.

> How it works: one takes the mros of the direct superclasses and the
> inheritance list of the considered class cl, and merges them as
> ordered sequences, in case of a tie the mros of the classes
> appearing earlier in the inheritance list are favored (this is what
> induces (3))
> 
> The intuitive difference with the current 2.2 mro is that C3 uses
> (3) only in case of a tie, while the current 2.2 mro algo tries to
> enforce a a mix of (1) and (3) at the same time.
> 
> From the examples this does not seem not to have any evident benefit
> (unless we consider the placement of b in ex5 such), and makes it
> the most complicated of all algorithms from the point of view of
> understanding the outcomes.

I'll have to read the paper describing C3:

http://www.webcom.com/haahr/dylan/linearization-oopsla96.html

but I expect I'll have to agree.  Thanks for your help!

--Guido van Rossum (home page: http://www.python.org/~guido/)