summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJames Hilton-Balfe <gobot1234yt@gmail.com>2022-03-08 03:50:46 (GMT)
committerGitHub <noreply@github.com>2022-03-08 03:50:46 (GMT)
commitf391f9bf28f0bba7939d9f9e5a7a6396d2b0df62 (patch)
tree4151190384181dca5446c61e6dd7c3230739a6e0
parent50731297a9b6d57eec3b3f89522785b23f7b3e71 (diff)
downloadcpython-f391f9bf28f0bba7939d9f9e5a7a6396d2b0df62.zip
cpython-f391f9bf28f0bba7939d9f9e5a7a6396d2b0df62.tar.gz
cpython-f391f9bf28f0bba7939d9f9e5a7a6396d2b0df62.tar.bz2
bpo-46170: Improve the error message when subclassing NewType (GH-30268)
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>
-rw-r--r--Lib/test/test_typing.py11
-rw-r--r--Lib/typing.py15
-rw-r--r--Misc/NEWS.d/next/Library/2021-12-26-14-45-51.bpo-46170.AQ7kSM.rst1
3 files changed, 27 insertions, 0 deletions
diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py
index 17d78cf..c76aa0a 100644
--- a/Lib/test/test_typing.py
+++ b/Lib/test/test_typing.py
@@ -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
diff --git a/Lib/typing.py b/Lib/typing.py
index 360129e..721afb7 100644
--- a/Lib/typing.py
+++ b/Lib/typing.py
@@ -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
index 0000000..5f266a2
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2021-12-26-14-45-51.bpo-46170.AQ7kSM.rst
@@ -0,0 +1 @@
+Improve the error message when you try to subclass an instance of :class:`typing.NewType`.