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:
parent
e1dc0db8c7
commit
7ddbaa7a1b
|
@ -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.
|
||||||
|
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Get docstrings for IDLE calltips more often by using inspect.getdoc.
|
Loading…
Reference in New Issue