Skip to content

Commit

Permalink
Add __subclasscheck__ for past.types.basestring
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
Yaseen Mowzer committed Mar 5, 2020
1 parent ef51288 commit c9bc0ff
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 3 deletions.
5 changes: 2 additions & 3 deletions src/past/types/basestring.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)):
Expand Down
19 changes: 19 additions & 0 deletions tests/test_past/test_basestring.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()

0 comments on commit c9bc0ff

Please sign in to comment.