Index: Lib/inspect.py =================================================================== --- Lib/inspect.py (revision 75274) +++ Lib/inspect.py (working copy) @@ -242,7 +242,7 @@ def isabstract(object): """Return true if the object is an abstract base class (ABC).""" - return isinstance(object, type) and object.__flags__ & TPFLAGS_IS_ABSTRACT + return bool(isinstance(object, type) and object.__flags__ & TPFLAGS_IS_ABSTRACT) def getmembers(object, predicate=None): """Return all members of an object as (name, value) pairs sorted by name. Index: Lib/test/test_inspect.py =================================================================== --- Lib/test/test_inspect.py (revision 75274) +++ Lib/test/test_inspect.py (working copy) @@ -115,7 +115,37 @@ self.assertTrue('a' in members) self.assertTrue('b' not in members) + def test_isabstract(self): + from abc import ABCMeta, abstractmethod + class AbstractClassExample(object): + __metaclass__ = ABCMeta + + @abstractmethod + def foo(self): + pass + + class ClassExample(AbstractClassExample): + def foo(self): + pass + + a = ClassExample() + + # Test general behaviour. + self.assertTrue(inspect.isabstract(AbstractClassExample)) + self.assertFalse(inspect.isabstract(ClassExample)) + self.assertFalse(inspect.isabstract(a)) + self.assertFalse(inspect.isabstract(int)) + self.assertFalse(inspect.isabstract(5)) + + # Test if function actually returns a boolean. + self.assertTrue(isinstance(inspect.isabstract(AbstractClassExample), bool)) + self.assertTrue(isinstance(inspect.isabstract(ClassExample), bool)) + self.assertTrue(isinstance(inspect.isabstract(a), bool)) + self.assertTrue(isinstance(inspect.isabstract(int), bool)) + self.assertTrue(isinstance(inspect.isabstract(5), bool)) + + class TestInterpreterStack(IsTestBase): def __init__(self, *args, **kwargs): unittest.TestCase.__init__(self, *args, **kwargs)