diff --git a/python2/test_typing.py b/python2/test_typing.py index 7f8c3a985..a4650465c 100644 --- a/python2/test_typing.py +++ b/python2/test_typing.py @@ -669,6 +669,14 @@ class D(C[T]): self.assertEqual(D.x, 'from derived x') self.assertEqual(D[str].z, 'from derived z') + def test_abc_registry_kept(self): + T = TypeVar('T') + class C(Generic[T]): pass + C.register(int) + self.assertIsInstance(1, C) + C[int] + self.assertIsInstance(1, C) + def test_false_subclasses(self): class MyMapping(MutableMapping[str, str]): pass self.assertNotIsInstance({}, MyMapping) diff --git a/python2/typing.py b/python2/typing.py index 867fa5353..ed644499e 100644 --- a/python2/typing.py +++ b/python2/typing.py @@ -1245,7 +1245,10 @@ def __copy__(self): def __setattr__(self, attr, value): # We consider all the subscripted genrics as proxies for original class - if attr.startswith('__') and attr.endswith('__'): + if ( + attr.startswith('__') and attr.endswith('__') or + attr.startswith('_abc_') + ): super(GenericMeta, self).__setattr__(attr, value) else: super(GenericMeta, _gorg(self)).__setattr__(attr, value) diff --git a/src/test_typing.py b/src/test_typing.py index 3a82b595d..f0070ec97 100644 --- a/src/test_typing.py +++ b/src/test_typing.py @@ -701,6 +701,14 @@ class D(C[T]): self.assertEqual(D.x, 'from derived x') self.assertEqual(D[str].z, 'from derived z') + def test_abc_registry_kept(self): + T = TypeVar('T') + class C(Generic[T]): ... + C.register(int) + self.assertIsInstance(1, C) + C[int] + self.assertIsInstance(1, C) + def test_false_subclasses(self): class MyMapping(MutableMapping[str, str]): pass self.assertNotIsInstance({}, MyMapping) diff --git a/src/typing.py b/src/typing.py index fc2ed94cf..9a0f49099 100644 --- a/src/typing.py +++ b/src/typing.py @@ -1160,7 +1160,10 @@ def __copy__(self): def __setattr__(self, attr, value): # We consider all the subscripted genrics as proxies for original class - if attr.startswith('__') and attr.endswith('__'): + if ( + attr.startswith('__') and attr.endswith('__') or + attr.startswith('_abc_') + ): super(GenericMeta, self).__setattr__(attr, value) else: super(GenericMeta, _gorg(self)).__setattr__(attr, value)