Skip to content

3.12.0b4 Backwards incompatible change with reassignment of cls.__new__ and super() #106917

Closed
@cdce8p

Description

@cdce8p

Bug report

Noticed this while testing 3.12.0b4. While in my particular case I can work around it, it never the less is a change in behavior to 3.11.

class FixedIntType(int):
    _signed: bool

    def __new__(cls, *args, **kwargs):
        print(f"{cls}, {args=}")
        return super().__new__(cls, *args, **kwargs)

    def __init_subclass__(cls, signed: int | None = None) -> None:
        super().__init_subclass__()
        if signed is not None:
            cls._signed = signed

        if "__new__" not in cls.__dict__:
            cls.__new__ = cls.__new__  # <-- This line triggers the error

class uint_t(FixedIntType, signed=False):
    pass

class CustomInt(uint_t):
    def __new__(cls, value: int = 0):
        return super().__new__(cls, value)

    def with_id(self, value: int):
        return type(self)(value)

CustomInt().with_id(1024)
<class '__main__.CustomInt'>, args=(0,)
<class '__main__.CustomInt'>, args=(<class '__main__.CustomInt'>, 1024)
Traceback (most recent call last):
  File "/.../cpython/test.py", line 26, in <module>
    CustomInt().with_id(1024)
  File "/.../cpython/test.py", line 24, in with_id
    return type(self)(value)
           ^^^^^^^^^^^^^^^^^
  File "/.../cpython/test.py", line 21, in __new__
    return super().__new__(cls, value)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/.../cpython/test.py", line 6, in __new__
    return super().__new__(cls, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ValueError: int() base must be >= 2 and <= 36, or 0

Without cls.__new__ = cls.__new__

<class '__main__.CustomInt'>, args=(0,)
<class '__main__.CustomInt'>, args=(1024,)

I bisected the issue to #103497.
/CC: @carljm

Your environment

  • CPython versions tested on: 3.120b4
  • Operating system and architecture: macOS ARM64

Linked PRs

Metadata

Metadata

Assignees

Labels

3.12only security fixes3.13bugs and security fixesinterpreter-core(Objects, Python, Grammar, and Parser dirs)type-bugAn unexpected behavior, bug, or error

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions