From ccf70d6f0bcc1f2571c828a5ff2e262b0817f44d Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Tue, 26 Oct 1999 13:09:08 +0000 Subject: Patch by Michael Hudson: when the object of attribute expansion is a class instance, include the class attributes in the list of possible expansions. --- Lib/rlcompleter.py | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) (limited to 'Lib/rlcompleter.py') diff --git a/Lib/rlcompleter.py b/Lib/rlcompleter.py index 92633abbc2..96abad0283 100644 --- a/Lib/rlcompleter.py +++ b/Lib/rlcompleter.py @@ -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) -- cgit v1.2.1