[Python-ideas] should there be a difference between generators and iterators?
Guido van Rossum
guido at python.org
Fri Sep 5 01:29:20 CEST 2008
The proposal to extend all iterators with an additional protocol goes
directly against one of the design goals for iterators, i.e., that it
should be easy to implement a new iterator, without subclassing
something. So any proposal that wants to add new methods to *all*
iterators (let alone all iterables, which is a much larger set -- read
abc.py in the 3.0 stdlib for the difference) is doomed. That said,
having *optional* additions to the protocol might still be reasonably
debated. On the 3rd hand, I'd like to understand more about your use
case.
On Thu, Sep 4, 2008 at 7:58 AM, Bruce Frederiksen <dangyogi at gmail.com> wrote:
> There are several points here that might or might not be adopted
> individually.
>
> The specific prompt for this message is that I've run into a snag using
> generators with 'itertools.chain.from_iterable'. I need to be able to
> control when the generators called by 'chain' get closed (so that their
> 'finally' clauses are run).
>
> Unfortunately, chain does not propagate 'close' (or 'throw' or 'send') back
> to the generators that it's using.
>
> Nor, for that matter do any of the other tools in itertools, or the builtin
> map function (to my knowledge).
>
> I propose the following. Each of these is independent of the others, but
> all related to cleaning up how this works:
>
> 1. All of the itertools and map (and I've no doubt left some others out
> here) be extended to propagate the extra generators methods: close, throw
> and send.
>
> 2. That the 'for' loop be extended so that if an exception occurs within
> its body, it calls 'throw' on its iterable (if it has a throw method).
>
> 3. That the 'for' loop be extended to call the 'close' method on its
> iterable (if it has a close method) when the loop terminates (either
> normally, with break, or with an exception).
>
> 4. That a 'not_closing' builtin function be added that takes an iterable
> and shields it from a 'close' call.
>
> 5. That 'close' and 'throw' be added to all iterables.
>
>
> Motivation:
>
> The motivation for each proposal is (by their number):
>
> 1. This is the one that I'm specifically stuck on. I was relying on
> garbage collection to do this, but this doesn't work in jython and
> ironpython... Since the chain function is dealing with two iterables (an
> inner and outer iterable), I think that it makes sense for it to check
> whether each of these have the extra methods or not. For example, the inner
> iterable may have a 'close', but not the outer iterable (or vise versa).
> This shouldn't cause an error if 'close' is called on the chain.
>
> This one, specifically, would be helpful for me to move to Python 3K; so the
> sooner the better! (Please!)
>
> 2. There has been some discussion here about extending 'for' loops that has
> touched on non-local continue/break capability. If step 2 is provided, this
> capability could be provided as follows:
>
> class funky:
> ...
> def continue_(self): raise ContinueError(self)
> def break_(self): raise BreakError(self)
> def throw(self, type, value, tb):
> if issubclass(type, ContinueError) and value.who is self:
> return next(self)
> if issubclass(type, BreakError) and value.who is self:
> raise StopIteration
>
> top = funky(iterable1)
> for x in top:
> middle = funky(iterable2)
> for y in middle:
> bottom = funky(iterable3)
> for z in bottom:
> ...
> middle.continue_()
>
> 3. But this is a problem with:
>
> for line in filex:
> if test1(line): break
> for line in filex:
> ...
>
> which brings us to:
>
> 4. A solution to the above:
>
> for line in not_closing(filex):
> if test1(line): break
> for line in filex:
> ...
>
> 5. I thought that I may as well throw this in for discussion... This might
> cause some consternation to those who has written their own iterables...
>
> _______________________________________________
> Python-ideas mailing list
> Python-ideas at python.org
> http://mail.python.org/mailman/listinfo/python-ideas
>
--
--Guido van Rossum (home page: http://www.python.org/~guido/)
More information about the Python-ideas
mailing list