Heisenberg strikes again!

neeson google at elesi.org
Wed Sep 10 20:51:17 EDT 2003


Thank you!  That answers my questions precisely. :)  You can see my
c/c++/java biases showing.  Expecting global variables to carry into
functions and not expecting silent exceptions to alter my execution
paths.  Valuable lessons!

Heath


"David C. Fox" <davidcfox at post.harvard.edu> wrote in message news:<nRM7b.311656$Oz4.100417 at rwcrnsc54>...
> neeson wrote:
> 
> > Alright, I'm fairly new to Python, and this one has got me stumped. 
> > I've just started to write a cli program that'll use readline, and
> > I've attached the relevant bits.
> > 
> > Here's the mystery:  If I so much as /look/ at the list 'matches',
> > readline stops working.  Run the program, hit tab at the prompt,
> > you'll get 'one', which is incorrect, as there are in fact four
> > possible completions.  Now comment out the line that I've marked
> > (which, incidentally, does nothing).  /Now/ it works.
> > 
> > Is there some very strange side effect to accessing a list element
> > that I'm unaware of?  I've tried it in two different versions of
> > Python.
> 
> No, but there is a side effect of accessing the first element of an 
> empty list: namely, Python raises an IndexError exception (i.e. index 
> out of range).
> 
> > Any elightenment would be appreciated...
> > 
> > Heath
> 
> 
> > 
> > import readline
> > import sys
> > 
> > commands = ["one", "two", "three", "four"]
> > matches = []
> > 
> > def comp(text, state):
> >     if state == 0:
> >         matches = []
> 
> Because you haven't used
> 
>      global matches
> 
> the next statement creates a new list called matches as a variable local 
> to comp.  All your matching commands are added to this variable, which 
> disappears when comp returns.
> 
> 
> >         n = len(text)
> >         for cmd in commands:
> >             if cmd[:n] == text:
> >                 matches.append(cmd)
> 
> 
> >     throwaway = matches[0]   # <--- Comment out this line
> 
> When comp is called with state == 0, matches is still referring to the 
> local list which is not empty (unless there were no matches to the 
> text), so this line does indeed do nothing.  However, when comp is 
> called with state != 0, this line refers to the global matches list, 
> which is empty, so it raises an IndexError, and the following line is 
> not reached.
> 
> Apparently, readline treats an exception in the completer as equivalent 
> to returning None.  In fact, you seem to be relying on this behavior 
> implicitly in the line below, because you are not checking whether state 
> < len(commands)
> 
> >     return commands[state]
> > 
> > readline.set_completer(comp)
> > readline.parse_and_bind("tab: complete")
> 
> David




More information about the Python-list mailing list