Issue #25472: In B[<type>], insert B in front of __bases__, to make the __dict__ descriptor work.
diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py
index a74ec07..dc4c152 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 @@
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 d900036..49c4a06 100644
--- a/Lib/typing.py
+++ b/Lib/typing.py
@@ -981,7 +981,7 @@
"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,