Commit 4e20de59 authored by Guido van Rossum's avatar Guido van Rossum

Patch by Michael Hudson: when the object of attribute expansion is a

class instance, include the class attributes in the list of possible
expansions.
parent d65b5392
"""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)
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment