On 3/7/2013 11:00 AM, Ian Kelly wrote:

But on this point, you are correct.  The mongoengine QuerySet.__iter__
method is defined as:

     def __iter__(self):
         self.rewind()
         return self

This is unfortunate design.  Not only does it mean that the iterator's
__len__ method cannot be trusted (what should the __len__ of a
partially exhausted iterator return?), but it also means that requesting
an iterator over the QuerySet will also silently invalidate any
existing iterators.

I view that design as a violation of the iterator protocol and hence a program bug. __iter__ should either *just* return self (if the self is an iterator) or return a new object (if self is a non-iterator iterable). File objects are iterators and .__iter__ does not rewind.

>>> f = open("f:/python/mypy/tem.py")
>>> next(f)
'class myit(list):\n'
>>> f2 = iter(f)
>>> f2 is f
True
>>> next(f2)
"    def __bytes__(self): return b'hello'\n"

--
Terry Jan Reedy

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to