diff -r 3c29d05c0710 Lib/rlcompleter.py --- a/Lib/rlcompleter.py Fri Sep 04 23:57:25 2015 +0200 +++ b/Lib/rlcompleter.py Sun Sep 06 00:25:55 2015 +0300 @@ -145,8 +145,16 @@ class Completer: words.extend(get_class_members(thisobject.__class__)) matches = [] n = len(attr) + if attr == '': + noprefix = '_' + elif attr == '_': + noprefix = '__' + else: + noprefix = None for word in words: - if word[:n] == attr and hasattr(thisobject, word): + if (word[:n] == attr and + not (noprefix and word[:n+1] == noprefix) and + hasattr(thisobject, word)): val = getattr(thisobject, word) word = self._callable_postfix(val, "%s.%s" % (expr, word)) matches.append(word) diff -r 3c29d05c0710 Lib/test/test_rlcompleter.py --- a/Lib/test/test_rlcompleter.py Fri Sep 04 23:57:25 2015 +0200 +++ b/Lib/test/test_rlcompleter.py Sun Sep 06 00:25:55 2015 +0300 @@ -5,6 +5,7 @@ import rlcompleter class CompleteMe: """ Trivial class used in testing rlcompleter.Completer. """ spam = 1 + _ham = 2 class TestRlcompleter(unittest.TestCase): @@ -56,6 +57,15 @@ class TestRlcompleter(unittest.TestCase) self.assertEqual(self.completer.attr_matches('CompleteMe.sp'), ['CompleteMe.spam']) self.assertEqual(self.completer.attr_matches('Completeme.egg'), []) + self.assertEqual(self.completer.attr_matches('CompleteMe.'), + ['CompleteMe.spam', 'CompleteMe.mro(']) + self.assertEqual(self.completer.attr_matches('CompleteMe._'), + ['CompleteMe._ham']) + a = self.completer.attr_matches('CompleteMe.__') + for x in a: + self.assertTrue(x.startswith('CompleteMe.__'), x) + self.assertIn('CompleteMe.__name__', a) + self.assertIn('CompleteMe.__new__(', a) CompleteMe.me = CompleteMe self.assertEqual(self.completer.attr_matches('CompleteMe.me.me.sp'),