summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRémi Lapeyre <remi.lapeyre@lenstra.fr>2020-06-30 13:48:15 (GMT)
committerGitHub <noreply@github.com>2020-06-30 13:48:15 (GMT)
commitbd4a3f21454a6012f4353e2255837561fc9f0e6a (patch)
tree145feda1b2af2f6e3fec17f0f4cc67e4c34ba390
parent0c4f0f3b29d84063700217dcf90ad6860ed71c70 (diff)
downloadcpython-bd4a3f21454a6012f4353e2255837561fc9f0e6a.zip
cpython-bd4a3f21454a6012f4353e2255837561fc9f0e6a.tar.gz
cpython-bd4a3f21454a6012f4353e2255837561fc9f0e6a.tar.bz2
bpo-39314: Closes parenthesis when autocompleting for functions that take no arguments (GH-20562)
-rw-r--r--Lib/rlcompleter.py9
-rw-r--r--Lib/test/test_rlcompleter.py8
-rw-r--r--Misc/NEWS.d/next/Library/2020-06-01-02-16-29.bpo-39314.0T9hlA.rst3
3 files changed, 15 insertions, 5 deletions
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 @@ Notes:
import atexit
import builtins
+import inspect
import __main__
__all__ = ["Completer"]
@@ -96,7 +97,13 @@ class Completer:
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 @@ class TestRlcompleter(unittest.TestCase):
# 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 @@ class TestRlcompleter(unittest.TestCase):
['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 @@ class TestRlcompleter(unittest.TestCase):
# 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__':
diff --git a/Misc/NEWS.d/next/Library/2020-06-01-02-16-29.bpo-39314.0T9hlA.rst b/Misc/NEWS.d/next/Library/2020-06-01-02-16-29.bpo-39314.0T9hlA.rst
new file mode 100644
index 0000000..e805332
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2020-06-01-02-16-29.bpo-39314.0T9hlA.rst
@@ -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.