[Python-ideas] MRO local precedence ordering revisited
Stephan Sahm
Stephan.Sahm at gmx.de
Thu Dec 10 15:03:58 EST 2015
Dear all,
this is a highly sensitive topic, isn't it? =) Thank you all for your
extensive responses. Of course I was a bit provocative with the sentence in
bold, but I haven't said this would be a bug, and if I have, I am sorry for
that.
I am in fact not familiar with what precisely are all the problems the C3
algorithm tries to solve, however my own intuitiv MRO would not be anything
proposed so far, but:
(B, mixin, A, mixin, object)
or in the simpler, more trivial version
(B, object, A, object)
As you haven't mentioned this as a possibility at all, I guess having a
class twice in this list produces some weird behaviour I do not know about
yet - if someone can point out, that would be great.
cheers,
Stephan
P.S.: I haven't said that I want a python 2.8, nevertheless thanks for
pointing out that there won't be a python 2.8 (this I in fact have not
known before)! I am familar with python 3.5 as well, however I just wanted
to make clear where I am working and in which language the example code is
runnable.
On 10 December 2015 at 19:58, Andrew Barnert <abarnert at yahoo.com> wrote:
> On Dec 10, 2015, at 08:36, Stephan Sahm <Stephan.Sahm at gmx.de> wrote:
>
> Dear all,
>
> I just pushed a very specific question which as I now recognized is far
> more general: It concerns python MRO (method resolution order).
>
> As reference I take https://www.python.org/download/releases/2.3/mro/
> There the section "Bad Method Resolution Orders" starts with an example
> which behaviour in the current python 2.7 is rather unintuitive to me.
>
>
> First off, Python 2.7 isn't going to change, and there isn't going to be a
> 2.8. If you want to propose changes to Python, you first need to learn
> what's changed up to 3.5, and then propose your change for 3.6.
>
> Second, the fact that it's unintuitive may be a problem with the
> description, rather than the algorithm. Once you understand what it's
> trying to do, and what you're trying to do, and why they're not compatible,
> it's intuitive that it doesn't work. Maybe the docs need to make it easier
> to understand what it's trying to do, and maybe you can help point out
> what's confusing you.
>
> Since Python just borrowed the C3 algorithm from Dylan to solve the same
> problems, and other languages have borrowed it as well, you might want to
> search for more generic documentation on it, too.
>
> Anyway, if you understand what C3 is solving, and you think it could be
> modified to still solve those problems while also allowing your use, or
> that one of those problems can't be solved but you don't think it's
> actually a problem, then explain that. Otherwise, I think you're either
> asking for something inconsistent, or asking for something consistent but
> broken, like the C++ rules (which would be even more broken in Python
> without first adding notions like virtual base class and auto-pre-supering
> constructors).
>
> I rename the example slightly to illustrate its usecase.
>
> class Mixin(object):
>> pass
>
> class A(Mixin):
>> pass
>> class B(Mixin, A):
>> pass
>
>
> this unfortunately throws "TypeError: Error when calling the metaclass
> bases Cannot create a consistent method resolution order (MRO) for bases A,
> Mixin"
>
>
> The reference name above comments this case similar to the following
> (adapted to the easier example above):
>
>> We see that class
>> B
>> inherits from
>> Mixin
>> and
>> A
>> , with
>> Mixin
>> before
>> A
>> : therefore we would expect attribute
>> s of
>> B
>> to be inherited
>> first
>> by
>> Mixin
>> and
>> then
>> by
>> A
>> : nevertheless Python 2.2
>> was giving the opposite behaviour.
>>
> ...
>> As a general rule, hierarchies such as the previous one should be
>> avoided, since it is unclear if
>> Mixin
>> should override
>> A
>> or viceversa
>
>
>
> While it might be the case that in Python 2.2 things where different, I
> cannot agree that the expected order of Method resolution is ambiguous (at
> least as far I see at this stage).
>
>
> Mixin has to appear before A so that its methods appear before A's. But
> Mixin has to appear between A and object so that A's methods can count on
> inheriting from it. How do you fit both those constraints?
>
> The reference itself says that we would expect
> B
> to be inherited
> first
> by
> Mixin
> and
> then
> by
> A. There is no ambiguity any longer.
>
>
> *Therefore I would like to propose to make this MRO again a valid one.*
>
>
> The usecase should be obvious: If you want a Mixin to be the first thing
> overwriting functions, but still want to inherit as normal.
>
>
> That's not what mixins are for. Mixins add behavior; something that
> changes the behavior of a real superclass is something different.
>
> (I myself want for instance a Mixin to overwrite the __init__ method,
> which is simply not impossible when choosing class B(A, Mixin))
>
>
> best,
> Stephan
>
>
>
> _______________________________________________
> Python-ideas mailing list
> Python-ideas at python.org
> https://mail.python.org/mailman/listinfo/python-ideas
> Code of Conduct: http://python.org/psf/codeofconduct/
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20151210/e32bbc42/attachment-0001.html>
More information about the Python-ideas
mailing list