diff --git a/Lib/rlcompleter.py b/Lib/rlcompleter.py index 931edcc4c3a..bca4a7bc521 100644 --- a/Lib/rlcompleter.py +++ b/Lib/rlcompleter.py @@ -75,9 +75,12 @@ class Completer: if not text.strip(): if state == 0: - readline.insert_text('\t') - readline.redisplay() - return '' + if _readline_available: + readline.insert_text('\t') + readline.redisplay() + return '' + else: + return '\t' else: return None @@ -192,10 +195,11 @@ def get_class_members(klass): try: import readline except ImportError: - pass + _readline_available = False else: readline.set_completer(Completer().complete) # Release references early at shutdown (the readline module's # contents are quasi-immortal, and the completer function holds a # reference to globals). atexit.register(lambda: readline.set_completer(None)) + _readline_available = True diff --git a/Lib/test/test_rlcompleter.py b/Lib/test/test_rlcompleter.py index 208c0545c44..0dc1080ca32 100644 --- a/Lib/test/test_rlcompleter.py +++ b/Lib/test/test_rlcompleter.py @@ -101,6 +101,7 @@ class TestRlcompleter(unittest.TestCase): completer = rlcompleter.Completer(dict(f=Foo())) self.assertEqual(completer.complete('f.', 0), 'f.bar') + @unittest.mock.patch('rlcompleter._readline_available', False) def test_complete(self): completer = rlcompleter.Completer() self.assertEqual(completer.complete('', 0), '\t')