bool (iterator)

Chirayu thephoenix235 at gmx.net
Mon Aug 5 07:39:33 CEST 2002


Hi people,

Is there a way for me to check if an iterator has "run out". I was hoping 
bool (iterator) would help but it always returns true.

example:

iterObj = iter (obj)
while 1:
    for i in iterObj:
       process i
       break based on some condition
    # continue until we've exhausted the iterator
    if bool (iterObj)==0: break


Below is a place in my project where i would have liked it. Read it if you 
have the time.

Here, I'm generating a dialog box dynamically from a tree structure.

case (1): without an iterator

def AddRecursive (parentSizer, obj):
    if obj.children: # obj.children = list of children
       leaves = []
       for i in obj.children:
          if i.children:
             leaves.append (i)
          else:
             if leaves:
                sizer = XXX # create a new sizer and add to parentSizer
                for j in leaves: AddRecursive (sizer, j)
                # add all the leaves to the new sizer
                leaves = []
             AddRecursive (parentSizer, i)
       if leaves:
          sizer = XXX # create a new sizer and add to parentSizer
          for j in leaves: AddRecursive (sizer, j)
          # add all the leaves to the new sizer
          leaves = []
    else:
       # handle the other case


Here, the lines in blue (if its plain text, then the code for "if leaves:" 
is repeated twice because I have to process the leaves either (1) when i 
dont find a leaf in the traversal, or (2) when the traversal is complete.

A better way would be

case (2): with an iterator

def AddRecursive (parentSizer, obj):
    leaves = []
    if obj.children: # obj.children = list of children
       iterChildren = iter (obj.children)
       while 1:
          for i in iterChildren:
             if i.children: leaves.append (i)
             else: break
          if leaves:
             sizer = XXX # create a new sizer and add to parentSizer
             for j in leaves: AddRecursive (sizer, j)
             # add all the leaves to the new sizer
             leaves = []
          AddRecursive (parentSizer, i)
          if not(bool(iterChildren)): break
    else:
       #handle the other case

the problem is that to terminate the while loop, i need to know if the 
iterator has "finished". bool(iterChildren) always returns true.

If anyone has a better solution, please do tell me. the line "if 
iterChildren==obj.children[-1]: break" does a nice job for me rite now (but 
only because obj.Children is never empty)

The reason I pasted all this code is to show that it can be helpful to have 
a nice value for a bool (iterator) (always returning 1 seems quite 
useless.) Hopefully some future version of python can have this additional 
change. (it should be trivial i think.....when StopIteration is thrown, a 
flag can probably be set in the iterator object???)

Chirayu.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-list/attachments/20020805/fef25dfc/attachment.html>


More information about the Python-list mailing list