[Python-Dev] Incorrect documentation (and possibly implementation) for rlcompleter.Completer?

Carl Johnson carl at carlsensei.com
Mon Jan 26 01:53:02 CET 2009


The documentation at http://docs.python.org/library/rlcompleter.html  
claims that

> Completer.complete(text, state)¶
>
>     Return the state*th completion for *text.
>
>     If called for text that doesn’t include a period character  
> ('.'), it will complete from names currently defined in __main__,  
> __builtin__ and keywords (as defined by the keyword module).
>
>     If called for a dotted name, it will try to evaluate anything  
> without obvious side-effects (functions will not be evaluated, but  
> it can generate calls to __getattr__()) up to the last part, and  
> find matches for the rest via the dir() function. Any exception  
> raised during the evaluation of the expression is caught, silenced  
> and None is returned.

In other words, it claims to use dir(obj) as part of the tab  
completion process. This is not true (using Python 2.6.1 on OS X):

 >>> class B(object):
...  def __dir__(self): return dir(u"") #Makes B objects look like  
strings
...
 >>> b = B()
 >>> dir(b)
['__add__', '__class__', '__contains__', '__delattr__', '__doc__',  
'__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__',  
'__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__',  
'__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__',  
'__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__',  
'__rmul__', '__setattr__', '__sizeof__', '__str__',  
'__subclasshook__', '_formatter_field_name_split',  
'_formatter_parser', 'capitalize', 'center', 'count', 'decode',  
'encode', 'endswith', 'expandtabs', 'find', 'format', 'index',  
'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'islower', 'isnumeric',  
'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip',  
'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition',  
'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip',  
'swapcase', 'title', 'translate', 'upper', 'zfill']
 >>> c = rlcompleter.Completer()
 >>> c.complete("b.", 0) #Notice that it does NOT return __add__
u'b.__class__('
 >>> c.matches #Notice that this list is completely different from the  
list given by dir(b)
[u'b.__class__(', u'b.__delattr__(', u'b.__doc__', u'b.__format__(',  
u'b.__getattribute__(', u'b.__hash__(', u'b.__init__(', u'b.__new__(',  
u'b.__reduce__(', u'b.__reduce_ex__(', u'b.__repr__(',  
u'b.__setattr__(', u'b.__sizeof__(', u'b.__str__(',  
u'b.__subclasshook__(', u'b.__class__(', u'b.__class__(',  
u'b.__delattr__(', u'b.__dict__', u'b.__dir__(', u'b.__doc__',  
u'b.__format__(', u'b.__getattribute__(', u'b.__hash__(',  
u'b.__init__(', u'b.__module__', u'b.__new__(', u'b.__reduce__(',  
u'b.__reduce_ex__(', u'b.__repr__(', u'b.__setattr__(',  
u'b.__sizeof__(', u'b.__str__(', u'b.__subclasshook__(',  
u'b.__weakref__', u'b.__class__(', u'b.__delattr__(', u'b.__doc__',  
u'b.__format__(', u'b.__getattribute__(', u'b.__hash__(',  
u'b.__init__(', u'b.__new__(', u'b.__reduce__(', u'b.__reduce_ex__(',  
u'b.__repr__(', u'b.__setattr__(', u'b.__sizeof__(', u'b.__str__(',  
u'b.__subclasshook__(']

As I see it, there are two ways to fix the problem: Change the  
documentation or change rlcompleter.Complete. I think the latter  
option is preferable (although it might have to wait for Python  
2.7/3.1), but I thought I would ask other people if I'm missing  
something and if not which fix is preferred. If other people agree  
that it's a bug, I'll file it.

-- Carl Johnson


More information about the Python-Dev mailing list