diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index eff0f5bfc4b1e1..e1b0e77491a77c 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -3643,24 +3643,32 @@ def foo(a: A) -> Optional[BaseException]: assert foo(None) is None +UserId = NewType('UserId', int) + + class NewTypeTests(BaseTestCase): + UserName = NewType('NewTypeTests.UserName', str) def test_basic(self): - UserId = NewType('UserId', int) - UserName = NewType('UserName', str) self.assertIsInstance(UserId(5), int) - self.assertIsInstance(UserName('Joe'), str) + self.assertIsInstance(NewTypeTests.UserName('Joe'), str) self.assertEqual(UserId(5) + 1, 6) def test_errors(self): - UserId = NewType('UserId', int) - UserName = NewType('UserName', str) with self.assertRaises(TypeError): issubclass(UserId, int) with self.assertRaises(TypeError): - class D(UserName): + class D(UserId): pass + def test_introspection(self): + UserName = NewTypeTests.UserName + self.assertEqual(UserName.__name__, 'UserName') + self.assertEqual(UserName.__qualname__, 'NewTypeTests.UserName') + self.assertEqual(UserName.__module__, __name__) + self.assertEqual(UserName.__supertype__, str) + self.assertIn('UserName', repr(UserName)) + class NamedTupleTests(BaseTestCase): class NestedEmployee(NamedTuple): diff --git a/Lib/typing.py b/Lib/typing.py index 00a0df591cbfcc..a094e059ce824e 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -2352,7 +2352,14 @@ def name_by_id(user_id: UserId) -> str: def new_type(x): return x + new_type.__qualname__ = name + if '.' in name: + name = name.rpartition('.')[-1] new_type.__name__ = name + try: + new_type.__module__ = sys._getframe(1).f_globals.get('__name__', '__main__') + except (AttributeError, ValueError): + pass new_type.__supertype__ = tp return new_type diff --git a/Misc/NEWS.d/next/Library/2018-10-18-14-00-37.bpo-34963.LT5FWe.rst b/Misc/NEWS.d/next/Library/2018-10-18-14-00-37.bpo-34963.LT5FWe.rst new file mode 100644 index 00000000000000..067e00439a2046 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-10-18-14-00-37.bpo-34963.LT5FWe.rst @@ -0,0 +1 @@ +The repr of the result of :func:`typing.NewType` is more meaningful now.