mirror of
https://github.com/python/cpython.git
synced 2025-07-19 01:05:26 +00:00
[3.9] bpo-40296: Fix supporting generic aliases in pydoc (GH-30253). (GH-31976) (GH-31981)
(cherry picked from commitcd44afc573
) (cherry picked from commita5b7678a67
)
This commit is contained in:
parent
cbcd2e36d6
commit
e207d721fc
4 changed files with 83 additions and 10 deletions
22
Lib/pydoc.py
22
Lib/pydoc.py
|
@ -69,6 +69,7 @@ import sys
|
|||
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 @@ class Doc:
|
|||
# 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
|
||||
|
@ -775,7 +779,7 @@ class HTMLDoc(Doc):
|
|||
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):
|
||||
|
@ -1217,7 +1221,7 @@ location listed above.
|
|||
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):
|
||||
|
@ -1698,7 +1702,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__
|
||||
|
@ -1759,7 +1763,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