mirror of
https://github.com/python/cpython.git
synced 2025-08-25 11:15:02 +00:00
#17476: make allmethods actually return all methods.
This fixes a regression relative to Python2. (In 2, methods on a class were unbound methods and matched the inspect queries being done, in 3 they are just functions and so were missed). This is an undocumented function that pydoc itself does not use, but I found that numpy at least uses it in its documentation generator. Original patch by Matt Bachmann.
This commit is contained in:
commit
52dfc74080
3 changed files with 32 additions and 2 deletions
|
@ -132,7 +132,10 @@ def stripid(text):
|
||||||
return _re_stripid.sub(r'\1', text)
|
return _re_stripid.sub(r'\1', text)
|
||||||
|
|
||||||
def _is_some_method(obj):
|
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):
|
def allmethods(cl):
|
||||||
methods = {}
|
methods = {}
|
||||||
|
|
|
@ -395,6 +395,30 @@ class PydocDocTest(unittest.TestCase):
|
||||||
synopsis = pydoc.synopsis(TESTFN, {})
|
synopsis = pydoc.synopsis(TESTFN, {})
|
||||||
self.assertEqual(synopsis, 'line 1: h\xe9')
|
self.assertEqual(synopsis, 'line 1: h\xe9')
|
||||||
|
|
||||||
|
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):
|
class PydocImportTest(unittest.TestCase):
|
||||||
|
|
||||||
|
|
|
@ -193,7 +193,10 @@ Core and Builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
Issue #16880: Do not assume _imp.load_dynamic() is defined in the imp module.
|
- Issue #17476: Fixed regression relative to Python2 in undocumented pydoc
|
||||||
|
'allmethods'; it was missing unbound methods on the class.
|
||||||
|
|
||||||
|
- Issue #16880: Do not assume _imp.load_dynamic() is defined in the imp module.
|
||||||
|
|
||||||
- Issue #16389: Fixed a performance regression relative to Python 3.1 in the
|
- Issue #16389: Fixed a performance regression relative to Python 3.1 in the
|
||||||
caching of compiled regular expressions.
|
caching of compiled regular expressions.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue