[Python-ideas] Consider (one day) adding an inheritance order class precedence mechanism
Koos Zevenhoven
k7hoven at gmail.com
Wed Nov 15 17:30:34 EST 2017
On Wed, Nov 15, 2017 at 11:49 PM, Neil Girdhar <mistersheik at gmail.com>
wrote:
> Sometimes I get MRO failures when defining classes. For example, if
>
> R < E, C
> B < S, E
> S < C
> Z < B, R
>
> Then Z cannot be instantiated because C precedes E in B and E precedes C
> in R. The problem is that when the inheritance graph was
> topologically-sorted in B, the order was S, C, E. It could just as easily
> have been S, E, C. So, one solution is to add C explicitly to B's base
> class list, but this is annoying because B might not care about C (it's an
> implementation detail of S). It also means that if the hierarchy changes,
> a lot of these added extra base classes need to be fixed.
>
> I propose adding a magic member to classes:
>
> __precedes__ that is a list of classes. So, the fix for the above problem
> would be to define E as follows:
>
> class E:
> from whatever import C
> __precedes__ = [C]
>
> Then, when topologically-sorting (so-called linearizing) the ancestor
> classes, Python can try to ensure that E precedes C when defining B.
>
>
So it sounds like you are talking about the way that the siblings in the
inheritance tree (the bases of each class) get "flattened" into the mro in
a depth-first manner, and the relative order of siblings is not preserved.
What would you think about not topologically sorting the inheritance tree
as such, but sorting a graph that has additional edges according to the
base lists of each class involved? In this case those edges would be E->C,
S->E, B->R. Is this what your talking about, or do I misinterpret the
problem?
-- Koos
--
+ Koos Zevenhoven + http://twitter.com/k7hoven +
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20171116/ae10c5aa/attachment.html>
More information about the Python-ideas
mailing list