bpo-42416: Use inspect.getdoc for IDLE calltips (GH-23416)

Inspect.getdoc(ob) sometimes gets docstrings when ob.__doc__ is None.
This commit is contained in:
Terry Jan Reedy 2020-11-20 01:59:11 -05:00 committed by GitHub
parent e1dc0db8c7
commit 7ddbaa7a1b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 13 additions and 6 deletions

View File

@ -3,6 +3,9 @@ Released on 2021-10-04?
====================================== ======================================
bpo-42416: Get docstrings for IDLE calltips more often
by using inspect.getdoc.
bpo-33987: Mostly finish using ttk widgets, mainly for editor, bpo-33987: Mostly finish using ttk widgets, mainly for editor,
settings, and searches. Some patches by Mark Roseman. settings, and searches. Some patches by Mark Roseman.

View File

@ -165,6 +165,7 @@ def get_argspec(ob):
ob_call = ob.__call__ ob_call = ob.__call__
except BaseException: # Buggy user object could raise anything. except BaseException: # Buggy user object could raise anything.
return '' # No popup for non-callables. return '' # No popup for non-callables.
# For Get_argspecTest.test_buggy_getattr_class, CallA() & CallB().
fob = ob_call if isinstance(ob_call, types.MethodType) else ob fob = ob_call if isinstance(ob_call, types.MethodType) else ob
# Initialize argspec and wrap it to get lines. # Initialize argspec and wrap it to get lines.
@ -185,10 +186,7 @@ def get_argspec(ob):
if len(argspec) > _MAX_COLS else [argspec] if argspec else []) if len(argspec) > _MAX_COLS else [argspec] if argspec else [])
# Augment lines from docstring, if any, and join to get argspec. # Augment lines from docstring, if any, and join to get argspec.
if isinstance(ob_call, types.MethodType): doc = inspect.getdoc(ob)
doc = ob_call.__doc__
else:
doc = getattr(ob, "__doc__", "")
if doc: if doc:
for line in doc.split('\n', _MAX_LINES)[:_MAX_LINES]: for line in doc.split('\n', _MAX_LINES)[:_MAX_LINES]:
line = line.strip() line = line.strip()

View File

@ -99,7 +99,12 @@ non-overlapping occurrences o...''')
(width=70, initial_indent='', subsequent_indent='', expand_tabs=True, (width=70, initial_indent='', subsequent_indent='', expand_tabs=True,
replace_whitespace=True, fix_sentence_endings=False, break_long_words=True, replace_whitespace=True, fix_sentence_endings=False, break_long_words=True,
drop_whitespace=True, break_on_hyphens=True, tabsize=8, *, max_lines=None, drop_whitespace=True, break_on_hyphens=True, tabsize=8, *, max_lines=None,
placeholder=' [...]')''') placeholder=' [...]')
Object for wrapping/filling text. The public interface consists of
the wrap() and fill() methods; the other methods are just there for
subclasses to override in order to tweak the default behaviour.
If you want to completely replace the main wrapping algorithm,
you\'ll probably have to override _wrap_chunks().''')
def test_properly_formated(self): def test_properly_formated(self):
@ -241,7 +246,7 @@ bytes() -> empty bytes object''')
__class__ = property({}.__getitem__, {}.__setitem__) __class__ = property({}.__getitem__, {}.__setitem__)
class Object(metaclass=Type): class Object(metaclass=Type):
__slots__ = '__class__' __slots__ = '__class__'
for meth, mtip in ((Type, default_tip), (Object, default_tip), for meth, mtip in ((Type, get_spec(type)), (Object, default_tip),
(Object(), '')): (Object(), '')):
with self.subTest(meth=meth, mtip=mtip): with self.subTest(meth=meth, mtip=mtip):
self.assertEqual(get_spec(meth), mtip) self.assertEqual(get_spec(meth), mtip)

View File

@ -0,0 +1 @@
Get docstrings for IDLE calltips more often by using inspect.getdoc.