mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	bpo-40296: Fix supporting generic aliases in pydoc (GH-30253)
This commit is contained in:
		
							parent
							
								
									a0db11b10f
								
							
						
					
					
						commit
						cd44afc573
					
				
					 4 changed files with 84 additions and 9 deletions
				
			
		
							
								
								
									
										22
									
								
								Lib/pydoc.py
									
										
									
									
									
								
							
							
						
						
									
										22
									
								
								Lib/pydoc.py
									
										
									
									
									
								
							|  | @ -69,6 +69,7 @@ class or function within a module or module in a package.  If the | |||
| import sysconfig | ||||
| import time | ||||
| import tokenize | ||||
| import types | ||||
| import urllib.parse | ||||
| import warnings | ||||
| from collections import deque | ||||
|  | @ -90,13 +91,16 @@ def pathdirs(): | |||
|             normdirs.append(normdir) | ||||
|     return dirs | ||||
| 
 | ||||
| def _isclass(object): | ||||
|     return inspect.isclass(object) and not isinstance(object, types.GenericAlias) | ||||
| 
 | ||||
| def _findclass(func): | ||||
|     cls = sys.modules.get(func.__module__) | ||||
|     if cls is None: | ||||
|         return None | ||||
|     for name in func.__qualname__.split('.')[:-1]: | ||||
|         cls = getattr(cls, name) | ||||
|     if not inspect.isclass(cls): | ||||
|     if not _isclass(cls): | ||||
|         return None | ||||
|     return cls | ||||
| 
 | ||||
|  | @ -104,7 +108,7 @@ def _finddoc(obj): | |||
|     if inspect.ismethod(obj): | ||||
|         name = obj.__func__.__name__ | ||||
|         self = obj.__self__ | ||||
|         if (inspect.isclass(self) and | ||||
|         if (_isclass(self) and | ||||
|             getattr(getattr(self, name, None), '__func__') is obj.__func__): | ||||
|             # classmethod | ||||
|             cls = self | ||||
|  | @ -118,7 +122,7 @@ def _finddoc(obj): | |||
|     elif inspect.isbuiltin(obj): | ||||
|         name = obj.__name__ | ||||
|         self = obj.__self__ | ||||
|         if (inspect.isclass(self) and | ||||
|         if (_isclass(self) and | ||||
|             self.__qualname__ + '.' + name == obj.__qualname__): | ||||
|             # classmethod | ||||
|             cls = self | ||||
|  | @ -205,7 +209,7 @@ def classname(object, modname): | |||
| 
 | ||||
| def isdata(object): | ||||
|     """Check if an object is of a type that probably means it's data.""" | ||||
|     return not (inspect.ismodule(object) or inspect.isclass(object) or | ||||
|     return not (inspect.ismodule(object) or _isclass(object) or | ||||
|                 inspect.isroutine(object) or inspect.isframe(object) or | ||||
|                 inspect.istraceback(object) or inspect.iscode(object)) | ||||
| 
 | ||||
|  | @ -470,7 +474,7 @@ def document(self, object, name=None, *args): | |||
|         # by lacking a __name__ attribute) and an instance. | ||||
|         try: | ||||
|             if inspect.ismodule(object): return self.docmodule(*args) | ||||
|             if inspect.isclass(object): return self.docclass(*args) | ||||
|             if _isclass(object): return self.docclass(*args) | ||||
|             if inspect.isroutine(object): return self.docroutine(*args) | ||||
|         except AttributeError: | ||||
|             pass | ||||
|  | @ -772,7 +776,7 @@ def docmodule(self, object, name=None, mod=None, *ignored): | |||
|         modules = inspect.getmembers(object, inspect.ismodule) | ||||
| 
 | ||||
|         classes, cdict = [], {} | ||||
|         for key, value in inspect.getmembers(object, inspect.isclass): | ||||
|         for key, value in inspect.getmembers(object, _isclass): | ||||
|             # if __all__ exists, believe it.  Otherwise use old heuristic. | ||||
|             if (all is not None or | ||||
|                 (inspect.getmodule(value) or object) is object): | ||||
|  | @ -1212,7 +1216,7 @@ def docmodule(self, object, name=None, mod=None): | |||
|             result = result + self.section('DESCRIPTION', desc) | ||||
| 
 | ||||
|         classes = [] | ||||
|         for key, value in inspect.getmembers(object, inspect.isclass): | ||||
|         for key, value in inspect.getmembers(object, _isclass): | ||||
|             # if __all__ exists, believe it.  Otherwise use old heuristic. | ||||
|             if (all is not None | ||||
|                 or (inspect.getmodule(value) or object) is object): | ||||
|  | @ -1696,7 +1700,7 @@ def describe(thing): | |||
|         return 'member descriptor %s.%s.%s' % ( | ||||
|             thing.__objclass__.__module__, thing.__objclass__.__name__, | ||||
|             thing.__name__) | ||||
|     if inspect.isclass(thing): | ||||
|     if _isclass(thing): | ||||
|         return 'class ' + thing.__name__ | ||||
|     if inspect.isfunction(thing): | ||||
|         return 'function ' + thing.__name__ | ||||
|  | @ -1757,7 +1761,7 @@ def render_doc(thing, title='Python Library Documentation: %s', forceload=0, | |||
|         desc += ' in module ' + module.__name__ | ||||
| 
 | ||||
|     if not (inspect.ismodule(object) or | ||||
|               inspect.isclass(object) or | ||||
|               _isclass(object) or | ||||
|               inspect.isroutine(object) or | ||||
|               inspect.isdatadescriptor(object) or | ||||
|               _getdoc(object)): | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Serhiy Storchaka
						Serhiy Storchaka