Skip to content

Commit f391f9b

Browse files
Gobot1234AlexWaygoodsobolevnFidget-Spinner
authored
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>
1 parent 5073129 commit f391f9b

File tree

3 files changed

+27
-0
lines changed

3 files changed

+27
-0
lines changed

Lib/test/test_typing.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4423,6 +4423,17 @@ def test_missing__name__(self):
44234423
)
44244424
exec(code, {})
44254425

4426+
def test_error_message_when_subclassing(self):
4427+
with self.assertRaisesRegex(
4428+
TypeError,
4429+
re.escape(
4430+
"Cannot subclass an instance of NewType. Perhaps you were looking for: "
4431+
"`ProUserId = NewType('ProUserId', UserId)`"
4432+
)
4433+
):
4434+
class ProUserId(UserId):
4435+
...
4436+
44264437

44274438
class NewTypePythonTests(NewTypeTests, BaseTestCase):
44284439
module = py_typing

Lib/typing.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2639,6 +2639,21 @@ def __init__(self, name, tp):
26392639
if def_mod != 'typing':
26402640
self.__module__ = def_mod
26412641

2642+
def __mro_entries__(self, bases):
2643+
# We defined __mro_entries__ to get a better error message
2644+
# if a user attempts to subclass a NewType instance. bpo-46170
2645+
superclass_name = self.__name__
2646+
2647+
class Dummy:
2648+
def __init_subclass__(cls):
2649+
subclass_name = cls.__name__
2650+
raise TypeError(
2651+
f"Cannot subclass an instance of NewType. Perhaps you were looking for: "
2652+
f"`{subclass_name} = NewType({subclass_name!r}, {superclass_name})`"
2653+
)
2654+
2655+
return (Dummy,)
2656+
26422657
def __repr__(self):
26432658
return f'{self.__module__}.{self.__qualname__}'
26442659

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Improve the error message when you try to subclass an instance of :class:`typing.NewType`.

0 commit comments

Comments
 (0)