From 982091845b15d7fa2d03854dca3045648f474c76 Mon Sep 17 00:00:00 2001 From: Pierre Sassoulas Date: Fri, 29 Aug 2025 12:02:29 +0200 Subject: [PATCH] Only the regression test --- .../dataclass_generic_init_subclass.py | 40 +++++++++++++++++++ .../dataclass_generic_init_subclass.txt | 0 2 files changed, 40 insertions(+) create mode 100644 tests/functional/d/dataclass/dataclass_generic_init_subclass.py create mode 100644 tests/functional/d/dataclass/dataclass_generic_init_subclass.txt diff --git a/tests/functional/d/dataclass/dataclass_generic_init_subclass.py b/tests/functional/d/dataclass/dataclass_generic_init_subclass.py new file mode 100644 index 0000000000..59cd6ec150 --- /dev/null +++ b/tests/functional/d/dataclass/dataclass_generic_init_subclass.py @@ -0,0 +1,40 @@ +"""Test for issue #10519: Crash with generic dataclass that has __init_subclass__""" + +from abc import ABC +from collections.abc import Callable +from dataclasses import dataclass, field +from typing import ParamSpec + +_P = ParamSpec("_P") + + +@dataclass +class Foo[T](ABC): + """A generic dataclass with __init_subclass__ that modifies __init__""" + + _foo: T | None = field(init=False) + _bar: dict[str, str] = field(init=False) + + def __init_subclass__(cls) -> None: + def _wrap(func: Callable[_P, None]) -> Callable[_P, None]: + def _w(*args: _P.args, **kwds: _P.kwargs) -> None: + self = args[0] + func(*args, **kwds) + if not hasattr(self, "_foo"): + object.__setattr__(self, "_foo", None) + if not hasattr(self, "_bar"): + object.__setattr__(self, "_bar", {}) + + return _w + + cls.__init__ = _wrap(cls.__init__) # type: ignore[method-assign] + + +@dataclass +class Bar(Foo): + """A subclass of the generic dataclass without type parameter""" + + +@dataclass +class Baz(Foo[str]): + """A subclass of the generic dataclass with type parameter""" diff --git a/tests/functional/d/dataclass/dataclass_generic_init_subclass.txt b/tests/functional/d/dataclass/dataclass_generic_init_subclass.txt new file mode 100644 index 0000000000..e69de29bb2