summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorƁukasz Langa <lukasz@langa.pl>2021-07-24 10:07:56 (GMT)
committerGitHub <noreply@github.com>2021-07-24 10:07:56 (GMT)
commit05f5d8e48c86c8025d3f82285666d93e52e360f9 (patch)
treecbf34875395909d5cd3fb48b0f99be4a7d414539 /Lib
parent45caee27159aa89b8dbcfde0c5faedea5f965584 (diff)
downloadcpython-05f5d8e48c86c8025d3f82285666d93e52e360f9.zip
cpython-05f5d8e48c86c8025d3f82285666d93e52e360f9.tar.gz
cpython-05f5d8e48c86c8025d3f82285666d93e52e360f9.tar.bz2
[3.10] bpo-44353: Expand NewType tests for complex __qualname__ (GH-27311) (GH-27326)
Make NewType pickleable by name. (cherry picked from commit e89ef0ad2a299770a88ece8f7a316f7d3eb65c9f) Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
Diffstat (limited to 'Lib')
-rw-r--r--Lib/test/test_typing.py56
-rw-r--r--Lib/typing.py7
2 files changed, 48 insertions, 15 deletions
diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py
index f5abbb2..5e3fba3 100644
--- a/Lib/test/test_typing.py
+++ b/Lib/test/test_typing.py
@@ -3673,28 +3673,35 @@ class TypeTests(BaseTestCase):
class NewTypeTests(BaseTestCase):
+ @classmethod
+ def setUpClass(cls):
+ global UserId
+ UserId = NewType('UserId', int)
+ cls.UserName = NewType(cls.__qualname__ + '.UserName', str)
+
+ @classmethod
+ def tearDownClass(cls):
+ global UserId
+ del UserId
+ del cls.UserName
+
+ def tearDown(self):
+ self.clear_caches()
def test_basic(self):
- UserId = NewType('UserId', int)
- UserName = NewType('UserName', str)
self.assertIsInstance(UserId(5), int)
- self.assertIsInstance(UserName('Joe'), str)
+ self.assertIsInstance(self.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_or(self):
- UserId = NewType('UserId', int)
- UserName = NewType('UserName', str)
-
- for cls in (int, UserName):
+ for cls in (int, self.UserName):
with self.subTest(cls=cls):
self.assertEqual(UserId | cls, Union[UserId, cls])
self.assertEqual(cls | UserId, Union[cls, UserId])
@@ -3703,16 +3710,37 @@ class NewTypeTests(BaseTestCase):
self.assertEqual(get_args(cls | UserId), (cls, UserId))
def test_special_attrs(self):
- UserId = NewType('UserId', int)
-
self.assertEqual(UserId.__name__, 'UserId')
self.assertEqual(UserId.__qualname__, 'UserId')
self.assertEqual(UserId.__module__, __name__)
+ self.assertEqual(UserId.__supertype__, int)
- def test_repr(self):
- UserId = NewType('UserId', int)
+ UserName = self.UserName
+ self.assertEqual(UserName.__name__, 'UserName')
+ self.assertEqual(UserName.__qualname__,
+ self.__class__.__qualname__ + '.UserName')
+ self.assertEqual(UserName.__module__, __name__)
+ self.assertEqual(UserName.__supertype__, str)
+ def test_repr(self):
self.assertEqual(repr(UserId), f'{__name__}.UserId')
+ self.assertEqual(repr(self.UserName),
+ f'{__name__}.{self.__class__.__qualname__}.UserName')
+
+ def test_pickle(self):
+ UserAge = NewType('UserAge', float)
+ for proto in range(pickle.HIGHEST_PROTOCOL + 1):
+ pickled = pickle.dumps(UserId, proto)
+ loaded = pickle.loads(pickled)
+ self.assertIs(loaded, UserId)
+
+ pickled = pickle.dumps(self.UserName, proto)
+ loaded = pickle.loads(pickled)
+ self.assertIs(loaded, self.UserName)
+
+ with self.assertRaises(pickle.PicklingError):
+ pickle.dumps(UserAge, proto)
+
class NamedTupleTests(BaseTestCase):
class NestedEmployee(NamedTuple):
diff --git a/Lib/typing.py b/Lib/typing.py
index 1606de9..ffd35e5 100644
--- a/Lib/typing.py
+++ b/Lib/typing.py
@@ -2375,8 +2375,10 @@ class NewType:
"""
def __init__(self, name, tp):
- self.__name__ = name
self.__qualname__ = name
+ if '.' in name:
+ name = name.rpartition('.')[-1]
+ self.__name__ = name
self.__module__ = _callee(default='typing')
self.__supertype__ = tp
@@ -2386,6 +2388,9 @@ class NewType:
def __call__(self, x):
return x
+ def __reduce__(self):
+ return self.__qualname__
+
def __or__(self, other):
return Union[self, other]