diff --git a/Lib/pydoc.py b/Lib/pydoc.py index 292aa46015e..4d681b0efa9 100755 --- a/Lib/pydoc.py +++ b/Lib/pydoc.py @@ -132,7 +132,10 @@ def stripid(text): return _re_stripid.sub(r'\1', text) def _is_some_method(obj): - return inspect.ismethod(obj) or inspect.ismethoddescriptor(obj) + return (inspect.isfunction(obj) or + inspect.ismethod(obj) or + inspect.isbuiltin(obj) or + inspect.ismethoddescriptor(obj)) def allmethods(cl): methods = {} diff --git a/Lib/test/test_pydoc.py b/Lib/test/test_pydoc.py index aa8baf723ca..8adcdd87a48 100644 --- a/Lib/test/test_pydoc.py +++ b/Lib/test/test_pydoc.py @@ -420,6 +420,30 @@ class PydocDocTest(unittest.TestCase): self.assertTrue(pydoc.ispackage(test_dir)) os.remove(init_path) + def test_allmethods(self): + # issue 17476: allmethods was no longer returning unbound methods. + # This test is a bit fragile in the face of changes to object and type, + # but I can't think of a better way to do it without duplicating the + # logic of the function under test. + + class TestClass(object): + def method_returning_true(self): + return True + + # What we expect to get back: everything on object... + expected = dict(vars(object)) + # ...plus our unbound method... + expected['method_returning_true'] = TestClass.method_returning_true + # ...but not the non-methods on object. + del expected['__doc__'] + del expected['__class__'] + # inspect resolves descriptors on type into methods, but vars doesn't, + # so we need to update __subclasshook__. + expected['__subclasshook__'] = TestClass.__subclasshook__ + + methods = pydoc.allmethods(TestClass) + self.assertDictEqual(methods, expected) + class PydocImportTest(unittest.TestCase): diff --git a/Misc/NEWS b/Misc/NEWS index d69146337c1..cb5eedf1140 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -289,6 +289,9 @@ Core and Builtins Library ------- +- Issue #17476: Fixed regression relative to Python2 in undocumented pydoc + 'allmethods'; it was missing unbound methods on the class. + - Issue #17474: Remove the deprecated methods of Request class. - Issue #16709: unittest discover order is no-longer filesystem specific. Patch