int.__init__ incompatible in Python 3.3
tjreedy at udel.edu
Thu Nov 8 21:29:38 CET 2012
On 11/8/2012 12:13 PM, Ian Kelly wrote:
> On Thu, Nov 8, 2012 at 8:55 AM, Ulrich Eckhardt
> <ulrich.eckhardt at dominolaser.com> wrote:
>> Preparing for an upgrade from 2.7 to 3, I stumbled across an incompatibility
>> between 2.7 and 3.2 on one hand and 3.3 on the other:
>> class X(int):
>> def __init__(self, value):
>> super(X, self).__init__(value)
This is a bug. Subclasses of immutables should not define __init__.
>>> int.__init__ is object.__init__
object.__init__(self) is a dummy placeholder function that takes no args
and does nothing.
>> On 2.7 and 3.2, the above code works.
That is a bug. It is documented that calling with the wrong number of
args is an error.
>> On 3.3, it gives me a "TypeError: object.__init__() takes no parameters".
>> To some extent, this makes sense to
>> me, because the int subobject is not initialized in __init__ but in __new__.
>> As a workaround, I can simple drop the parameter from the call.
Just drop the do-nothing call.
>> breaking backward compatibility is another issue, so I wonder if that should
>> be considered as a bug.
Every bug fix breaks backward compatibility with code that depends on
the bug. Such breakage is not a bug, but, as in this case, some fixes
are not put in bugfix releases because of such breakage.
>> Bug? Feature? Other suggestions?
There was additional discussion on pydev or python-ideas lists before
the final commit. This fix was not back-ported to 2.7 or 3.2.
> A similar change was made to object.__init__ in 2.6, so this could
> just be bringing the behavior of int into line with object. There's
> nothing about it in the whatsnew document, though.
What's New is a summary of *new* features. It does not list bug fixes.
At the top it says " For full details, see the Misc/NEWS file." The last
patch on the issue added this entry.
Core and Builtins
- Issue #1683368: object.__new__ and object.__init__ raise a TypeError
if they are passed arguments and their complementary method is not
> I say open a bug report and let the devs sort it out.
Please do not. The current situation is the result of 'sorting it out'
over several years.
Terry Jan Reedy
More information about the Python-list