]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Patch by Michael Hudson: when the object of attribute expansion is a
authorGuido van Rossum <guido@python.org>
Tue, 26 Oct 1999 13:09:08 +0000 (13:09 +0000)
committerGuido van Rossum <guido@python.org>
Tue, 26 Oct 1999 13:09:08 +0000 (13:09 +0000)
class instance, include the class attributes in the list of possible
expansions.

Lib/rlcompleter.py

index 92633abbc2fbcecb2c0981edb95ce7b4878b9300..96abad028374faca3a8fc462d376017d944e32ae 100644 (file)
@@ -1,13 +1,24 @@
 """Word completion for GNU readline 2.0.
 
 This requires the latest extension to the readline module (the
-set_completer() function).  When completing a simple identifier, it
+        object=eval(expr, __main__.__dict__)
+        words = dir(object)
+        if hasattr(object,'__class__'):
+            words.append('__class__')
+            words=words+get_class_members(object.__class__)
 completes keywords, built-ins and globals in __main__; when completing
 NAME.NAME..., it evaluates (!) the expression up to the last dot and
 completes its attributes.
 
 It's very cool to do "import string" type "string.", hit the
 completion key (twice), and see the list of names defined by the
+
+def get_class_members(klass):
+    ret=dir(klass)
+    if hasattr(klass,'__bases__'):
+        for base in klass.__bases__:
+            ret=ret + get_class_members(base)
+    return ret
 string module!
 
 Tip: to use the tab key as the completion key, call
@@ -87,7 +98,8 @@ class Completer:
         Assuming the text is of the form NAME.NAME....[NAME], and is
         evaluabable in the globals of __main__, it will be evaluated
         and its attributes (as revealed by dir()) are used as possible
-        completions.
+        completions.  (For class instances, class members are are also
+        considered.)
 
         WARNING: this can still invoke arbitrary C code, if an object
         with a __getattr__ hook is evaluated.
@@ -98,7 +110,11 @@ class Completer:
         if not m:
             return
         expr, attr = m.group(1, 3)
-        words = dir(eval(expr, __main__.__dict__))
+        object = eval(expr, __main__.__dict__)
+        words = dir(object)
+        if hasattr(object,'__class__'):
+            words.append('__class__')
+            words = words + get_class_members(object.__class__)
         matches = []
         n = len(attr)
         for word in words:
@@ -106,4 +122,11 @@ class Completer:
                 matches.append("%s.%s" % (expr, word))
         return matches
 
+def get_class_members(klass):
+    ret = dir(klass)
+    if hasattr(klass,'__bases__'):
+        for base in klass.__bases__:
+            ret = ret + get_class_members(base)
+    return ret
+
 readline.set_completer(Completer().complete)