mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +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 @@ def test_synopsis(self): | ||||||
|             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
	
	 R David Murray
						R David Murray