Skip to content

Commit 05f5d8e

Browse files
[3.10] bpo-44353: Expand NewType tests for complex __qualname__ (GH-27311) (GH-27326)
Make NewType pickleable by name. (cherry picked from commit e89ef0a) Co-authored-by: Serhiy Storchaka <[email protected]>
1 parent 45caee2 commit 05f5d8e

File tree

2 files changed

+48
-15
lines changed

2 files changed

+48
-15
lines changed

Lib/test/test_typing.py

Lines changed: 42 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3673,28 +3673,35 @@ def foo(a: A) -> Optional[BaseException]:
36733673

36743674

36753675
class NewTypeTests(BaseTestCase):
3676+
@classmethod
3677+
def setUpClass(cls):
3678+
global UserId
3679+
UserId = NewType('UserId', int)
3680+
cls.UserName = NewType(cls.__qualname__ + '.UserName', str)
3681+
3682+
@classmethod
3683+
def tearDownClass(cls):
3684+
global UserId
3685+
del UserId
3686+
del cls.UserName
3687+
3688+
def tearDown(self):
3689+
self.clear_caches()
36763690

36773691
def test_basic(self):
3678-
UserId = NewType('UserId', int)
3679-
UserName = NewType('UserName', str)
36803692
self.assertIsInstance(UserId(5), int)
3681-
self.assertIsInstance(UserName('Joe'), str)
3693+
self.assertIsInstance(self.UserName('Joe'), str)
36823694
self.assertEqual(UserId(5) + 1, 6)
36833695

36843696
def test_errors(self):
3685-
UserId = NewType('UserId', int)
3686-
UserName = NewType('UserName', str)
36873697
with self.assertRaises(TypeError):
36883698
issubclass(UserId, int)
36893699
with self.assertRaises(TypeError):
3690-
class D(UserName):
3700+
class D(UserId):
36913701
pass
36923702

36933703
def test_or(self):
3694-
UserId = NewType('UserId', int)
3695-
UserName = NewType('UserName', str)
3696-
3697-
for cls in (int, UserName):
3704+
for cls in (int, self.UserName):
36983705
with self.subTest(cls=cls):
36993706
self.assertEqual(UserId | cls, Union[UserId, cls])
37003707
self.assertEqual(cls | UserId, Union[cls, UserId])
@@ -3703,16 +3710,37 @@ def test_or(self):
37033710
self.assertEqual(get_args(cls | UserId), (cls, UserId))
37043711

37053712
def test_special_attrs(self):
3706-
UserId = NewType('UserId', int)
3707-
37083713
self.assertEqual(UserId.__name__, 'UserId')
37093714
self.assertEqual(UserId.__qualname__, 'UserId')
37103715
self.assertEqual(UserId.__module__, __name__)
3716+
self.assertEqual(UserId.__supertype__, int)
37113717

3712-
def test_repr(self):
3713-
UserId = NewType('UserId', int)
3718+
UserName = self.UserName
3719+
self.assertEqual(UserName.__name__, 'UserName')
3720+
self.assertEqual(UserName.__qualname__,
3721+
self.__class__.__qualname__ + '.UserName')
3722+
self.assertEqual(UserName.__module__, __name__)
3723+
self.assertEqual(UserName.__supertype__, str)
37143724

3725+
def test_repr(self):
37153726
self.assertEqual(repr(UserId), f'{__name__}.UserId')
3727+
self.assertEqual(repr(self.UserName),
3728+
f'{__name__}.{self.__class__.__qualname__}.UserName')
3729+
3730+
def test_pickle(self):
3731+
UserAge = NewType('UserAge', float)
3732+
for proto in range(pickle.HIGHEST_PROTOCOL + 1):
3733+
pickled = pickle.dumps(UserId, proto)
3734+
loaded = pickle.loads(pickled)
3735+
self.assertIs(loaded, UserId)
3736+
3737+
pickled = pickle.dumps(self.UserName, proto)
3738+
loaded = pickle.loads(pickled)
3739+
self.assertIs(loaded, self.UserName)
3740+
3741+
with self.assertRaises(pickle.PicklingError):
3742+
pickle.dumps(UserAge, proto)
3743+
37163744

37173745
class NamedTupleTests(BaseTestCase):
37183746
class NestedEmployee(NamedTuple):

Lib/typing.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2375,8 +2375,10 @@ def name_by_id(user_id: UserId) -> str:
23752375
"""
23762376

23772377
def __init__(self, name, tp):
2378-
self.__name__ = name
23792378
self.__qualname__ = name
2379+
if '.' in name:
2380+
name = name.rpartition('.')[-1]
2381+
self.__name__ = name
23802382
self.__module__ = _callee(default='typing')
23812383
self.__supertype__ = tp
23822384

@@ -2386,6 +2388,9 @@ def __repr__(self):
23862388
def __call__(self, x):
23872389
return x
23882390

2391+
def __reduce__(self):
2392+
return self.__qualname__
2393+
23892394
def __or__(self, other):
23902395
return Union[self, other]
23912396

0 commit comments

Comments
 (0)