<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Wed, Oct 19, 2016 at 2:38 PM, Paul Moore <span dir="ltr"><<a href="mailto:p.f.moore@gmail.com" target="_blank">p.f.moore@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span class="gmail-">On 19 October 2016 at 19:13, Chris Angelico <<a href="mailto:rosuav@gmail.com">rosuav@gmail.com</a>> wrote:<br>
> Now it *won't* correctly call the end-of-iteration function, because<br>
> there's no 'for' loop. This is going to either (a) require that EVERY<br>
> consumer of an iterator follow this new protocol, or (b) introduce a<br>
> ton of edge cases.<br>
<br>
</span>Also, unless I'm misunderstanding the proposal, there's a fairly major<br>
compatibility break. At present we have:<br>
<br>
>>> lst = [1,2,3,4]<br>
>>> it = iter(lst)<br>
>>> for i in it:<br>
...   if i == 2: break<br>
<br>
>>> for i in it:<br>
...   print(i)<br>
3<br>
4<br>
>>><br>
<br>
With the proposed behaviour, if I understand it, "it" would be closed<br>
after the first loop, so resuming "it" for the second loop wouldn't<br>
work. Am I right in that? I know there's a proposed itertools function<br>
to bring back the old behaviour, but it's still a compatibility break.<br>
And code like this, that partially consumes an iterator, is not<br>
uncommon.<br>
<span class="gmail-HOEnZb"><font color="#888888"><br>
Paul</font></span><br></blockquote></div><br></div><div class="gmail_extra">I may very well be misunderstanding the purpose of the proposal, but that is not how I saw it being used.  I thought of it being used to clean up things that happened in the loop, rather than clean up the iterator itself.  This would allow the iterator to manage events that occurred in the body of the loop.  So it would be more like this scenario:<br><br>>>> lst = objiterer([obj1, obj2, obj3, obj4])<br>
>>> it = iter(lst)<br>
>>> for i, _ in zip(it, [1, 2]):<br></div><div class="gmail_extra">
...   b = i.some_method()<br>
>>> for i in it:<br></div><div class="gmail_extra">
...   c = i.other_method()<br>
>>><br><br></div><div class="gmail_extra">In this case, objiterer would do some cleanup related to obj1 and obj2 in the first loop and some cleanup related to obj3 and obj4 in the second loop.  There would be no backwards-compatibility break, the method would be purely opt-in and most typical iterators wouldn't need it.<br><br></div><div class="gmail_extra">However, in this case perhaps it might be better to have some method that is called after every loop, no matter how the loop is terminated (break, continue, return).  This would allow the cleanup to be done every loop rather than just at the end.<br></div></div>