super() appears not to work with multiple inheritance
This derives from this forum post.
class A:
def __init__(self):
print("A.__init__")
class B(A):
def __init__(self):
print("B.__init__")
super().__init__()
class C(A):
def __init__(self):
print("C.__init__")
super().__init__()
class D(B,C):
def __init__(self):
print("D.__init__")
super().__init__()
If you issue D() at the REPL you get:
>>> D()
D.__init__
B.__init__
A.__init__
<D object at aac31180>
whereas cPython gives:
>>> D()
D.__init__
B.__init__
C.__init__
A.__init__
<__main__.D object at 0x7f40ecd1a358>
>>>
A further issue with super() - with single inheritance - is this. Despite numerous successful uses I wrote one class where super() returned an empty string. Unfortunately any attempt to produce a test case failed. I appreciate that's a lousy bug report but I thought it worth mentioning if the code is being reviewed.
py/runtime: Fix self arg passed to classmethod when accessed via super.
Summary
MicroPython was not conforming to CPython behaviour when using super() within a classmethod. This patch fixes this behaviour.
Testing
New test added which did not pass before, but now passes.
Thanks to @AJMansfield for the original test case.
Trade-offs and Alternatives
This increases code size a little bit, but if not fixed it can lead to some very difficult to debug problems, if you even notice there's a problem in the first place.