]> granicus.if.org Git - python/commitdiff
Issue #25472: In B[<type>], insert B in front of __bases__, to make the __dict__...
authorGuido van Rossum <guido@python.org>
Thu, 19 Nov 2015 05:12:58 +0000 (21:12 -0800)
committerGuido van Rossum <guido@python.org>
Thu, 19 Nov 2015 05:12:58 +0000 (21:12 -0800)
Lib/test/test_typing.py
Lib/typing.py

index a74ec079b56f9b92601c45004f9fb746b42e3302..dc4c1525af4117cecf131b2d8a8805263f29ada3 100644 (file)
@@ -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]
index d900036e5144d293bd5f9e287c42396ac302f460..49c4a06973523c7c696cdeb0b6dbcaae5626b97c 100644 (file)
@@ -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,