Oh, come on you two... stop beating up the poor strawman. The reiter() function doesn't make a single redundant call to __iter__. It's just like iter() but ensures in passing that the result is really a fresh iterator.
I'm really sorry. I had forgotten what exactly your proposal was. It is actually very reasonable: Proposal: new built-in function reiter() def reiter(obj): """reiter(obj) -> iterator Get an iterator from an object. If the object is already an iterator a TypeError exception will be raised. For all Python built-in types it is guaranteed that if this function succeeds the next call to reiter() will return a new iterator that produces the same items unless the object is modified. Non-builtin iterable objects which are not iterators SHOULD support multiple iteration returning the same items.""" it = iter(obj) if it is obj: raise TypeError('Object is not re-iterable') return it --Guido van Rossum (home page: http://www.python.org/~guido/)