bpo-39314: Closes parenthesis when autocompleting for functions that take no arguments (GH-20562)

This commit is contained in:
Rémi Lapeyre 2020-06-30 15:48:15 +02:00 committed by GitHub
parent 0c4f0f3b29
commit bd4a3f2145
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 15 additions and 5 deletions

View File

@ -31,6 +31,7 @@ Notes:
import atexit import atexit
import builtins import builtins
import inspect
import __main__ import __main__
__all__ = ["Completer"] __all__ = ["Completer"]
@ -96,7 +97,13 @@ class Completer:
def _callable_postfix(self, val, word): def _callable_postfix(self, val, word):
if callable(val): if callable(val):
word = word + "(" word += "("
try:
if not inspect.signature(val).parameters:
word += ")"
except ValueError:
pass
return word return word
def global_matches(self, text): def global_matches(self, text):

View File

@ -40,12 +40,12 @@ class TestRlcompleter(unittest.TestCase):
# test with a customized namespace # test with a customized namespace
self.assertEqual(self.completer.global_matches('CompleteM'), self.assertEqual(self.completer.global_matches('CompleteM'),
['CompleteMe(']) ['CompleteMe()'])
self.assertEqual(self.completer.global_matches('eg'), self.assertEqual(self.completer.global_matches('eg'),
['egg(']) ['egg('])
# XXX: see issue5256 # XXX: see issue5256
self.assertEqual(self.completer.global_matches('CompleteM'), self.assertEqual(self.completer.global_matches('CompleteM'),
['CompleteMe(']) ['CompleteMe()'])
def test_attr_matches(self): def test_attr_matches(self):
# test with builtins namespace # test with builtins namespace
@ -64,7 +64,7 @@ class TestRlcompleter(unittest.TestCase):
['CompleteMe.spam']) ['CompleteMe.spam'])
self.assertEqual(self.completer.attr_matches('Completeme.egg'), []) self.assertEqual(self.completer.attr_matches('Completeme.egg'), [])
self.assertEqual(self.completer.attr_matches('CompleteMe.'), self.assertEqual(self.completer.attr_matches('CompleteMe.'),
['CompleteMe.mro(', 'CompleteMe.spam']) ['CompleteMe.mro()', 'CompleteMe.spam'])
self.assertEqual(self.completer.attr_matches('CompleteMe._'), self.assertEqual(self.completer.attr_matches('CompleteMe._'),
['CompleteMe._ham']) ['CompleteMe._ham'])
matches = self.completer.attr_matches('CompleteMe.__') matches = self.completer.attr_matches('CompleteMe.__')
@ -134,7 +134,7 @@ class TestRlcompleter(unittest.TestCase):
# No opening bracket "(" because we overrode the built-in class # No opening bracket "(" because we overrode the built-in class
self.assertEqual(completer.complete('memoryview', 0), 'memoryview') self.assertEqual(completer.complete('memoryview', 0), 'memoryview')
self.assertIsNone(completer.complete('memoryview', 1)) self.assertIsNone(completer.complete('memoryview', 1))
self.assertEqual(completer.complete('Ellipsis', 0), 'Ellipsis(') self.assertEqual(completer.complete('Ellipsis', 0), 'Ellipsis()')
self.assertIsNone(completer.complete('Ellipsis', 1)) self.assertIsNone(completer.complete('Ellipsis', 1))
if __name__ == '__main__': if __name__ == '__main__':

View File

@ -0,0 +1,3 @@
:class:`rlcompleter.Completer` and the standard Python shell now close the
parenthesis for functions that take no arguments. Patch contributed by Rémi
Lapeyre.