From 357f1d981f027289943d954a90e5b3b136993939 Mon Sep 17 00:00:00 2001 From: Xuanteng Huang Date: Sat, 11 Oct 2025 17:39:55 +0800 Subject: [PATCH 1/2] better error msg for generic alias subclass --- Lib/test/test_genericalias.py | 14 ++++++++++++++ Lib/typing.py | 3 +++ 2 files changed, 17 insertions(+) diff --git a/Lib/test/test_genericalias.py b/Lib/test/test_genericalias.py index 4e08adaca05cdd..50731fac212940 100644 --- a/Lib/test/test_genericalias.py +++ b/Lib/test/test_genericalias.py @@ -203,6 +203,20 @@ class C(list[int]): self.assertEqual(C.__bases__, (list,)) self.assertEqual(C.__class__, type) + class Foo: + def __init_subclass__(cls) -> None: + pass + + class Bar: + def __init_subclass__(cls) -> None: + super().__init_subclass__() + + class FooSub[T](Foo): pass + class BarSub[T](Bar): pass + with self.assertRaisesRegex(RuntimeError, '__parameters__'): + _ = FooSub[int] + _ = BarSub[int] + def test_class_methods(self): t = dict[int, None] self.assertEqual(dict.fromkeys(range(2)), {0: None, 1: None}) # This works diff --git a/Lib/typing.py b/Lib/typing.py index 4311a77b8db749..48009bf0380f00 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -1158,6 +1158,9 @@ def _generic_class_getitem(cls, args): f"Parameters to {cls.__name__}[...] must all be unique") else: # Subscripting a regular Generic subclass. + if not hasattr(cls, "__parameters__"): + raise RuntimeError(f"{cls.__name__} has no __parameters__, " + f"you may forget to call super().__init_subclass__()") for param in cls.__parameters__: prepare = getattr(param, '__typing_prepare_subst__', None) if prepare is not None: From facf010e410bd8aea3b6dc5620742ec30cecada7 Mon Sep 17 00:00:00 2001 From: Xuanteng Huang Date: Sat, 11 Oct 2025 17:53:34 +0800 Subject: [PATCH 2/2] add news entry --- .../2025-10-11-17-53-24.gh-issue-139905.qCm4jW.rst | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-10-11-17-53-24.gh-issue-139905.qCm4jW.rst diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-11-17-53-24.gh-issue-139905.qCm4jW.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-11-17-53-24.gh-issue-139905.qCm4jW.rst new file mode 100644 index 00000000000000..611b7610d48f6d --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-11-17-53-24.gh-issue-139905.qCm4jW.rst @@ -0,0 +1,2 @@ +Print better error message when subclassing `GenericAlias` without calling +``super().__init_subclass__``.