From c9bc0ff1807cb663be9bcaadd69e57f6ba60fe13 Mon Sep 17 00:00:00 2001 From: Yaseen Mowzer Date: Thu, 5 Mar 2020 08:54:27 +0200 Subject: [PATCH] Add __subclasscheck__ for past.types.basestring Previously `__subclasscheck__` was not implemented which lead to inconsistencies between `isinstance` and `issubclass` (i.e. `isinstance("a string", basestring)` is true, but `issubclass(str, basestring)` was false. This commit fixes this incorrect behavior. --- src/past/types/basestring.py | 5 ++--- tests/test_past/test_basestring.py | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/past/types/basestring.py b/src/past/types/basestring.py index 1cab22f6..9c21715a 100644 --- a/src/past/types/basestring.py +++ b/src/past/types/basestring.py @@ -25,9 +25,8 @@ class BaseBaseString(type): def __instancecheck__(cls, instance): return isinstance(instance, (bytes, str)) - def __subclasshook__(cls, thing): - # TODO: What should go here? - raise NotImplemented + def __subclasscheck__(cls, subclass): + return super(BaseBaseString, cls).__subclasscheck__(subclass) or issubclass(subclass, (bytes, str)) class basestring(with_metaclass(BaseBaseString)): diff --git a/tests/test_past/test_basestring.py b/tests/test_past/test_basestring.py index d002095e..6c224b3e 100644 --- a/tests/test_past/test_basestring.py +++ b/tests/test_past/test_basestring.py @@ -19,6 +19,25 @@ def test_isinstance(self): s2 = oldstr(b'abc') self.assertTrue(isinstance(s2, basestring)) + def test_issubclass(self): + self.assertTrue(issubclass(str, basestring)) + self.assertTrue(issubclass(bytes, basestring)) + self.assertTrue(issubclass(basestring, basestring)) + self.assertFalse(issubclass(int, basestring)) + self.assertFalse(issubclass(list, basestring)) + self.assertTrue(issubclass(basestring, object)) + + class CustomString(basestring): + pass + class NotString(object): + pass + class OldStyleClass: + pass + self.assertTrue(issubclass(CustomString, basestring)) + self.assertFalse(issubclass(NotString, basestring)) + self.assertFalse(issubclass(OldStyleClass, basestring)) + + if __name__ == '__main__': unittest.main()