summaryrefslogtreecommitdiff
path: root/Lib/rlcompleter.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/rlcompleter.py')
-rw-r--r--Lib/rlcompleter.py35
1 files changed, 26 insertions, 9 deletions
diff --git a/Lib/rlcompleter.py b/Lib/rlcompleter.py
index 3f970536dd..378f5aa647 100644
--- a/Lib/rlcompleter.py
+++ b/Lib/rlcompleter.py
@@ -29,6 +29,7 @@ Notes:
"""
+import atexit
import builtins
import __main__
@@ -72,6 +73,12 @@ class Completer:
if self.use_main_ns:
self.namespace = __main__.__dict__
+ if not text.strip():
+ if state == 0:
+ return '\t'
+ else:
+ return None
+
if state == 0:
if "." in text:
self.matches = self.attr_matches(text)
@@ -96,13 +103,16 @@ class Completer:
"""
import keyword
matches = []
+ seen = {"__builtins__"}
n = len(text)
for word in keyword.kwlist:
if word[:n] == text:
+ seen.add(word)
matches.append(word)
- for nspace in [builtins.__dict__, self.namespace]:
+ for nspace in [self.namespace, builtins.__dict__]:
for word, val in nspace.items():
- if word[:n] == text and word != "__builtins__":
+ if word[:n] == text and word not in seen:
+ seen.add(word)
matches.append(self._callable_postfix(val, word))
return matches
@@ -129,20 +139,23 @@ class Completer:
return []
# get the content of the object, except __builtins__
- words = dir(thisobject)
- if "__builtins__" in words:
- words.remove("__builtins__")
+ words = set(dir(thisobject))
+ words.discard("__builtins__")
if hasattr(thisobject, '__class__'):
- words.append('__class__')
- words.extend(get_class_members(thisobject.__class__))
+ words.add('__class__')
+ words.update(get_class_members(thisobject.__class__))
matches = []
n = len(attr)
for word in words:
- if word[:n] == attr and hasattr(thisobject, word):
- val = getattr(thisobject, word)
+ if word[:n] == attr:
+ try:
+ val = getattr(thisobject, word)
+ except Exception:
+ continue # Exclude properties that are not set
word = self._callable_postfix(val, "%s.%s" % (expr, word))
matches.append(word)
+ matches.sort()
return matches
def get_class_members(klass):
@@ -158,3 +171,7 @@ except ImportError:
pass
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))