diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index a74ec079b56..dc4c1525af4 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -1,4 +1,5 @@ from collections import namedtuple +import pickle import re import sys from unittest import TestCase, main @@ -583,6 +584,35 @@ class GenericTests(TestCase): self.assertEqual(repr(MySimpleMapping), __name__ + '.' + 'MySimpleMapping[~XK, ~XV]') + def test_dict(self): + T = TypeVar('T') + class B(Generic[T]): + pass + b = B() + b.foo = 42 + self.assertEqual(b.__dict__, {'foo': 42}) + class C(B[int]): + pass + c = C() + c.bar = 'abc' + self.assertEqual(c.__dict__, {'bar': 'abc'}) + + def test_pickle(self): + T = TypeVar('T') + class B(Generic[T]): + pass + global C # pickle wants to reference the class by name + class C(B[int]): + pass + c = C() + c.foo = 42 + c.bar = 'abc' + z = pickle.dumps(c) + x = pickle.loads(z) + self.assertEqual(x.foo, 42) + self.assertEqual(x.bar, 'abc') + self.assertEqual(x.__dict__, {'foo': 42, 'bar': 'abc'}) + def test_errors(self): with self.assertRaises(TypeError): B = SimpleMapping[XK, Any] diff --git a/Lib/typing.py b/Lib/typing.py index d900036e514..49c4a069735 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -981,7 +981,7 @@ class GenericMeta(TypingMeta, abc.ABCMeta): "Cannot substitute %s for %s in %s" % (_type_repr(new), _type_repr(old), self)) - return self.__class__(self.__name__, self.__bases__, + return self.__class__(self.__name__, (self,) + self.__bases__, dict(self.__dict__), parameters=params, origin=self,