On 19 November 2017 at 06:56, Neil Girdhar <mistersh...@gmail.com> wrote: > Would you mind explaining why it's necessary for C3 to complain? > > In: > > S < C > B < S, E > R < E, C > Z < B, R > > If Z is told to have MRO: > > (Z, B, S, R, E, C) > > then there are no conflicts with any base classes.
I don't actually know what C3 allows in principle, I only know that CPython's resolver still complains in practice: >>> class C: pass ... >>> class S(C): pass ... >>> class E: pass ... >>> class B(S, E): pass ... >>> class R(E, C): pass ... >>> class Z(B, S, R, E, C): pass ... Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: Cannot create a consistent method resolution order (MRO) for bases C, E I think the problem is that the resolver isn't looking at the declared bases of "B", and "R", it's looking at their full MRO: >>> B.__mro__ (<class '__main__.B'>, <class '__main__.S'>, <class '__main__.C'>, <class '__main__.E'>, <class 'object'>) >>> R.__mro__ (<class '__main__.R'>, <class '__main__.E'>, <class '__main__.C'>, <class 'object'>) Changing the heuristics used to generate B's MRO such that "C" and "E" appeared in the opposite order wouldn't really help, since that would just flip the problematic case to be the "R(C, E)" declaration. Cheers, Nick. -- Nick Coghlan | ncogh...@gmail.com | Brisbane, Australia _______________________________________________ Python-ideas mailing list Python-ideas@python.org https://mail.python.org/mailman/listinfo/python-ideas Code of Conduct: http://python.org/psf/codeofconduct/