]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-46170: Improve the error message when subclassing NewType (GH-30268)
authorJames Hilton-Balfe <gobot1234yt@gmail.com>
Tue, 8 Mar 2022 03:50:46 +0000 (03:50 +0000)
committerGitHub <noreply@github.com>
Tue, 8 Mar 2022 03:50:46 +0000 (19:50 -0800)
Co-authored-by: Alex Waygood <alex.waygood@gmail.com>
Co-authored-by: Nikita Sobolev <mail@sobolevn.me>
Co-authored-by: Ken Jin <28750310+Fidget-Spinner@users.noreply.github.com>
Lib/test/test_typing.py
Lib/typing.py
Misc/NEWS.d/next/Library/2021-12-26-14-45-51.bpo-46170.AQ7kSM.rst [new file with mode: 0644]

index 17d78cffcb4fa83982dfe8a2bc6c2cc4bc720bc4..c76aa0adefeb9795a9d116876e9568a73fa338a2 100644 (file)
@@ -4423,6 +4423,17 @@ class NewTypeTests:
                 )
         exec(code, {})
 
+    def test_error_message_when_subclassing(self):
+        with self.assertRaisesRegex(
+            TypeError,
+            re.escape(
+                "Cannot subclass an instance of NewType. Perhaps you were looking for: "
+                "`ProUserId = NewType('ProUserId', UserId)`"
+            )
+        ):
+            class ProUserId(UserId):
+                ...
+
 
 class NewTypePythonTests(NewTypeTests, BaseTestCase):
     module = py_typing
index 360129e3db34ee993d8c7ebe3e7136c9da099cd0..721afb7a03fd9e2ae756177a134b46294c9568d2 100644 (file)
@@ -2639,6 +2639,21 @@ class NewType:
         if def_mod != 'typing':
             self.__module__ = def_mod
 
+    def __mro_entries__(self, bases):
+        # We defined __mro_entries__ to get a better error message
+        # if a user attempts to subclass a NewType instance. bpo-46170
+        superclass_name = self.__name__
+
+        class Dummy:
+            def __init_subclass__(cls):
+                subclass_name = cls.__name__
+                raise TypeError(
+                    f"Cannot subclass an instance of NewType. Perhaps you were looking for: "
+                    f"`{subclass_name} = NewType({subclass_name!r}, {superclass_name})`"
+                )
+
+        return (Dummy,)
+
     def __repr__(self):
         return f'{self.__module__}.{self.__qualname__}'
 
diff --git a/Misc/NEWS.d/next/Library/2021-12-26-14-45-51.bpo-46170.AQ7kSM.rst b/Misc/NEWS.d/next/Library/2021-12-26-14-45-51.bpo-46170.AQ7kSM.rst
new file mode 100644 (file)
index 0000000..5f266a2
--- /dev/null
@@ -0,0 +1 @@
+Improve the error message when you try to subclass an instance of :class:`typing.NewType`.