[Python-ideas] Introduce collections.Reiterable

Antoine Pitrou solipsis at pitrou.net
Thu Sep 19 11:30:47 CEST 2013


Le Thu, 19 Sep 2013 04:59:35 -0400,
Neil Girdhar <mistersheik at gmail.com> a
écrit :
> Well, generators are iterable, but if you write a function like:
> 
> def f(s):
>      for x in s:
>              do_something(x)
>      for x in s:
>              do_something_else(x)
> 
> x should not be a generator.  I am proposing adding a function to
> itertools like auto_reiterable that would take s and give you an
> reiterable in the most efficient way possible.

Try the following:


import collections
import itertools


class Reiterable:

    def __init__(self, it):
        self.need_cloning = isinstance(it, collections.Iterator)
        assert self.need_cloning or isinstance(it, collections.Iterable)
        self.master = it

    def __iter__(self):
        if self.need_cloning:
            self.master, it = itertools.tee(self.master)
            return it
        else:
            return iter(self.master)

def gen():
    yield from "ghi"

for arg in ("abc", iter("def"), gen()):
    it = Reiterable(arg)
    print(list(it))
    print(list(it))
    print(list(it))


I don't know if that would be useful as part of the stdlib.

Regards

Antoine.




More information about the Python-ideas mailing list