On Tue, Aug 15, 2017 at 9:56 AM, Evan Aad <oddevene...@gmail.com> wrote: > According to the description of Python's method resolution order (mro) > (https://www.python.org/download/releases/2.3/mro/), a.k.a. C3 > linearization (see Wikipedia), the algorithm can be described as > follows: > > "the linearization of C is the sum of C plus the merge of the > linearizations of the parents and the list of the parents." > > Symbolically, the algorithm is defined recursively thus: > > L(O) = <O> > L(C) = <C> + merge(L(B1),..., L(Bn), <B1,...,Bn>) > > where > > * O is the class from which every class inherits. > * C is a class that inherits directly from B1, ..., Bn, in this order. > * < and > are list delimiters. > * + is the list-concatenation operator. > * 'merge' merges its list arguments into a single list with no > repetitions in the manner described in the next paragraph. > > Consider the head of the first list, i.e L(B1)[0]: if it is a good > head, i.e. if it is not in the proper tail of any of the other lists, > add it to the linearization of C, and remove it from all the lists in > the merge. Otherwise, consider the head of the next list, etc. Repeat > until no more classes, or no good heads. In the latter case, it is > impossible to construct the merge. > > > > Why is the list <B1,...,Bn> of parents given as an argument to > 'merge'? Will the algorithm produce different results if this argument > is omitted?
It ensures that the parents are linearized in that order. Without that list, it would be possible for B2 to appear before B1 in the MRO of C. -- https://mail.python.org/mailman/listinfo/python-list