bpo-39314: Closes parenthesis when autocompleting for functions that take no arguments (GH-20562)
diff --git a/Lib/rlcompleter.py b/Lib/rlcompleter.py
index bca4a7b..c06388e 100644
--- a/Lib/rlcompleter.py
+++ b/Lib/rlcompleter.py
@@ -31,6 +31,7 @@
import atexit
import builtins
+import inspect
import __main__
__all__ = ["Completer"]
@@ -96,7 +97,13 @@
def _callable_postfix(self, val, word):
if callable(val):
- word = word + "("
+ word += "("
+ try:
+ if not inspect.signature(val).parameters:
+ word += ")"
+ except ValueError:
+ pass
+
return word
def global_matches(self, text):
diff --git a/Lib/test/test_rlcompleter.py b/Lib/test/test_rlcompleter.py
index 0dc1080..ee3019d 100644
--- a/Lib/test/test_rlcompleter.py
+++ b/Lib/test/test_rlcompleter.py
@@ -40,12 +40,12 @@
# test with a customized namespace
self.assertEqual(self.completer.global_matches('CompleteM'),
- ['CompleteMe('])
+ ['CompleteMe()'])
self.assertEqual(self.completer.global_matches('eg'),
['egg('])
# XXX: see issue5256
self.assertEqual(self.completer.global_matches('CompleteM'),
- ['CompleteMe('])
+ ['CompleteMe()'])
def test_attr_matches(self):
# test with builtins namespace
@@ -64,7 +64,7 @@
['CompleteMe.spam'])
self.assertEqual(self.completer.attr_matches('Completeme.egg'), [])
self.assertEqual(self.completer.attr_matches('CompleteMe.'),
- ['CompleteMe.mro(', 'CompleteMe.spam'])
+ ['CompleteMe.mro()', 'CompleteMe.spam'])
self.assertEqual(self.completer.attr_matches('CompleteMe._'),
['CompleteMe._ham'])
matches = self.completer.attr_matches('CompleteMe.__')
@@ -134,7 +134,7 @@
# No opening bracket "(" because we overrode the built-in class
self.assertEqual(completer.complete('memoryview', 0), 'memoryview')
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))
if __name__ == '__main__':