<div dir="ltr"><div>I appreciate the discussion illuminating various aspects of this I hadn't considered. Finally, what I think I want is for<br></div><div>* all sequences</div><div>* all views</div><div>* numpy arrays</div>

<div>to answer yes to reiterable, and</div><div>* all generators</div><div>to answer no to reiterable.</div><div><br></div><div class="gmail_extra">Best, Neil<br><br><div class="gmail_quote">On Fri, Sep 20, 2013 at 10:12 PM, Stephen J. Turnbull <span dir="ltr"><<a href="mailto:stephen@xemacs.org" target="_blank">stephen@xemacs.org</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="im">Terry Reedy writes:<br>
<br>
 > Dismissing legal code as 'pathological', as more than one person has,<br>
 > does not cut it as a design principle.<br>
<br>
</div>But you don't even need to write a class with __getitem__() to get<br>
that behavior.<br>
<br>
>>> l = [11, 12, 13]<br>
>>> for i in l:<br>
...  print(i)<br>
...  if i%2 == 0:<br>
...   l.remove(i)<br>
...<br>
11<br>
12<br>
>>> l<br>
[11, 13]<br>
>>><br>
<br>
Of course the iteration itself is probably buggy (ie, the writer<br>
didn't mean to skip printing '13'), but in general iterables can<br>
change themselves.<br>
<br>
Neil himself seems to be of two minds about such cases.  On the one<br>
hand, he said the above behavior is built in to list, so it's<br>
acceptable to him.  (I think that's inconsistent: I would say the<br>
property of being completely consumed is built in to iterator, so it<br>
should be acceptable, too.)  On the other hand, he's defined a<br>
reiterable as a collection that when iterated produces the same<br>
objects in the same order.<br>
<br>
Maybe what we really want is for copy.deepcopy to do the right thing<br>
with iterables.  Then code that doesn't want to consume consumable<br>
iterables can do a deepcopy (including replication of the closed-over<br>
state of __next__() for iterators) before iterating.<br>
<br>
Or perhaps the right thing is a copy.itercopy that creates a new<br>
composite object as a shallow copy of everything except that it clones<br>
the state of __next__() in case the object was an iterator to start<br>
with.<br>
<div class="HOEnZb"><div class="h5">_______________________________________________<br>
Python-ideas mailing list<br>
<a href="mailto:Python-ideas@python.org">Python-ideas@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/python-ideas" target="_blank">https://mail.python.org/mailman/listinfo/python-ideas</a><br>
<br>
--<br>
<br>
---<br>
You received this message because you are subscribed to a topic in the Google Groups "python-ideas" group.<br>
To unsubscribe from this topic, visit <a href="https://groups.google.com/d/topic/python-ideas/OumiLGDwRWA/unsubscribe" target="_blank">https://groups.google.com/d/topic/python-ideas/OumiLGDwRWA/unsubscribe</a>.<br>
To unsubscribe from this group and all its topics, send an email to <a href="mailto:python-ideas%2Bunsubscribe@googlegroups.com">python-ideas+unsubscribe@googlegroups.com</a>.<br>
For more options, visit <a href="https://groups.google.com/groups/opt_out" target="_blank">https://groups.google.com/groups/opt_out</a>.<br>
</div></div></blockquote></div><br></div></div>