[Python-ideas] Consider (one day) adding an inheritance order class precedence mechanism
Neil Girdhar
mistersheik at gmail.com
Wed Nov 15 22:28:44 EST 2017
On Wednesday, November 15, 2017 at 5:32:00 PM UTC-5, Koos Zevenhoven wrote:
>
> On Wed, Nov 15, 2017 at 11:49 PM, Neil Girdhar <miste... at gmail.com
> <javascript:>> 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.
>
It is preserved, but there are insufficient constraints, which causes
problems with future class definitions.
> 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?
>
That's already part of the topological sorting algorithm. You have to do
that. I'm suggesting additional constraints.
>
> -- Koos
>
>
> --
> + Koos Zevenhoven + http://twitter.com/k7hoven +
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20171115/b703afb7/attachment.html>
More information about the Python-ideas
mailing list