On Jun 1, 2:38 am, Piet van Oostrum <p...@cs.uu.nl> wrote:
> >>>>> LittleGrasshopper <seattleha...@yahoo.com> (L) wrote:
> >L> On May 31, 3:59 pm, Carl Banks <pavlovevide...@gmail.com> wrote:
> >>> On May 31, 3:52 pm, LittleGrasshopper <seattleha...@yahoo.com> wrote:
>
> >>> > This is some simple code which I got from Guido's paper on the
> >>> > unification of classes and types, which Arnaud suggested to improve my
> >>> > knowledge of metaclasses:
>
> >>> > class M1(type):
> >>> >     pass
> >>> > class M2(M1):
> >>> >     pass
> >>> > class M3(M2):
> >>> >     pass
> >>> > class C1:
> >>> >     __metaclass__ = M1
> >>> > class C2(C1):
> >>> >     __metaclass__ = M2
> >>> > class C3(C1, C2):
> >>> >     __metaclass__ = M3
>
> >>> > It is failing when processing C3:
> >>> > Traceback (most recent call last):
> >>> >   File "metaerror.py", line 18, in <module>
> >>> >     class C3(C1, C2):
> >>> > TypeError: Error when calling the metaclass bases
> >>> >     Cannot create a consistent method resolution
> >>> > order (MRO) for bases C2, C1
>
> [snip]
>
> >L> I guess the resulting MROs do not satisfy monotonicity, I
> >L> just have to find out how to derive the MRO. I had the notion that it
> >L> was constructed by listing the current class, followed by the MROs of
> >L> each base in order, and then retaining the rightmost instance of each
> >L> class in the MRO list, but I think that might be an
> >L> oversimplification, since in this case that would be:
> >L> (C1, object)
> >L> (C2, C1, object)
> >L> (C3, C2, C1, object)
> >L> And I don't see any issues. But I'll read the paper to figure out what
> >L> the problem is, thanks.
>
> Here is exactly the problem. Merging the two MRO's as you state would
> give C3, C2, C1, object, i.e. C2 before C1.
>
> But your class definition:
>
> class C3(C1, C2):
> says that C1 should be before C2. Conflict!!
> Change it to class C3(C2, C1):
>
> You see it has nothing to do with the metaclasses. The following code
> gives the same error:
>
> class C1(object):
>     pass
> class C2(C1):
>     pass
> class C3(C1, C2):
>     pass
>
> --
> Piet van Oostrum <p...@cs.uu.nl>
> URL:http://pietvanoostrum.com[PGP 8DAE142BE17999C4]
> Private email: p...@vanoostrum.org

Thank you, Piet. You are correct. I actually went through the whole C3
MRO paper from Michele and I realized the issue (local precedence is
not maintained.) And, like you said, the way to fix it is to change
the order of the bases in C3.
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to