Ben Finney wrote: > Gabriel Genellina <[EMAIL PROTECTED]> writes: > > > At Wednesday 25/10/2006 23:29, Paul Rubin wrote: > > >Steve Holden <[EMAIL PROTECTED]> writes: > > >I get that iter(()) is True (Python 2.3.4). > > > > It's False on 2.4.2 - and perhaps it's what one would expect, but > > since this behavior is not documented anywhere, one should not count > > on it.
Good advice, because on 2.5 it's True again. > Doesn't this fall under "any empty sequence" in the following list of > evaluates-to-false: Nope. An iterator is not a sequence, and it's impossible to determine whether an iterator is "empty" in general, except by trying to get an item from it. So even in 2.4.3 some "empty" iterators return True: >>> a = [] >>> bool(x for x in a) True The only reasonable advice is to avoid the direct boolean test ("if a:") altogether if you want to support iterators. Unfortunately, iterators and lists have a lot of overlapping use, and it's very common to test for emptiness of lists using "if a:". If one tries to use an iterator where a list is expected it could lead to a silent failure. IMO, this is big time wart in the language. Iterators have no calculatable truth value; for many other types a truth value doesn't make sense (for instance: function objects, type objects, modules, user-defined types that don't bother with __nonzero__). Using such objects in a boolean context is almost always an error. Objects of these types should raise exceptions when used as a boolen. numpy arrays wisely already do this. (I'll stop short of mentioning that, because neither numpy arrays nor iterators consider "empty" to be "false", the idea that "empty" is "false" is very far from self-evident; therefore lists, tuples, dicts, and sets should also raise exceptions when used as a boolean. I won't mention that, though.) Carl Banks -- http://mail.python.org/mailman/listinfo/python-list