__nonzero__ of iterators

Yermat loic at fejoz.net
Fri Apr 2 02:00:59 EST 2004


Christian Eder wrote:
> Hi,
> 
> I just discovered the following pitfall in Python 2.3.
> Consider the following code :
> 
>  >>> a = {}
>  >>> bool (a.keys ())
> False
>  >>> bool (a.iterkeys ())
> True
> 
> So, an "empty" iterator evaluates to True in boolean context.
> At a first glance, this is not what one would expect. This causes 
> several problems, e.g. if you operate on something expected to be 
> sequence, and you guard your code with "if seq :" to avoid crashing into 
> an empty sequence, you still crash if you get an empty iterator, even if 
> the rest of your code is able to deal with an iterator as well as with 
> any other sequence type.
> 
> At a second glance, the behaviour is clear, since the iterator object 
> does not know wheter it is able to provide the next element, before 
> having done so.
> 
> Anyway, although I don't know how the iterator protocol is implemented 
> in Python 2.3, I suppose the __nonzero__ could be changed to check 
> whether a next element can be provided without actually consuming it.
> 
> I would like to read some comments on this topic as I'm sure that I'm 
> not the first one wondering whether the current behaviour should be that 
> way.
> 
> thanks
> chris
> 

In fact, what is missing is a 'hasNext' function...

But for your example, the behavior is quite clear.
bool(a.keys()) == bool([]) == False
Whereas:
bool(a.iterkeys()) = bool(anIterator) == (anIterator != None) == True

So what is really missing is a hasNext method on Iterator. It would also 
be usefull in some loop.

But what to do with Generator ?

Yermat




More information about the Python-list mailing list