[Python-checkins] cpython (merge 3.2 -> 3.3): #17476: make allmethods actually return all methods.

r.david.murray python-checkins at python.org
Tue Mar 19 07:48:03 CET 2013


http://hg.python.org/cpython/rev/7127fbc363bb
changeset: 82752:7127fbc363bb
branch: 3.3
parent: 82741:ea76cfff5851
parent: 82751:0a9b42de49d5
user: R David Murray <rdmurray at bitdance.com>
date: Tue Mar 19 02:32:35 2013 -0400
summary:
 #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.
files:
 Lib/pydoc.py | 5 ++++-
 Lib/test/test_pydoc.py | 24 ++++++++++++++++++++++++
 Misc/NEWS | 5 ++++-
 3 files changed, 32 insertions(+), 2 deletions(-)
diff --git a/Lib/pydoc.py b/Lib/pydoc.py
--- a/Lib/pydoc.py
+++ b/Lib/pydoc.py
@@ -132,7 +132,10 @@
 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
--- a/Lib/test/test_pydoc.py
+++ b/Lib/test/test_pydoc.py
@@ -395,6 +395,30 @@
 synopsis = pydoc.synopsis(TESTFN, {})
 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):
 
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -193,7 +193,10 @@
 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
 caching of compiled regular expressions.
-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /