[Python-ideas] Aid reiteration with new class: gfic

Terry Reedy tjreedy at udel.edu
Thu Jun 18 23:02:12 CEST 2009


Backgound:
Most functions that take an iterable as parameter iterate just once.
Users of the function can pass any iterable, including iterators.
The function will call iter(imput) and go.
If the user wants to iterate thru a virtual collection defined by an 
instance of an iterator class (built-in or user-defined) or generator 
function, the user must call the gf/ic with the appropriate arguments 
and pass the result.

Problem:
Some functions iterate thru the input more than once. If the input is 
not an iterator, there is no problem: call iter(input) again. If the 
input is an iterator, that just returns the now-empty iterator.  Bad.

General solution:
The most general solution is for the caller to pass the result of 
list(it) instead of it. If the caller starts with only an iterator, that 
   is the only solution I know of.

Special solution:
If the caller starts with an non-iterable iterator source -- iterator 
class or generator function (which can be regarded as defining a virtual 
subclass of iterator class 'generator') -- it might be better to package 
that source and required args as an iterable.

class gfic: #untested as yet
   def __init__(self, func, *args, **kwds):
     self.func = func
     self.args = args
     self.kwds = kwds
     self.__name__ = func.__name__
   def __iter__(self):
     return self.func(*self.args, **self.kwds)

This is similar, I believe, to functools.partial except that the 
wrapping is total rather than partial and the wrapped call is in 
__iter__ instead of __call__.

Would this be a sensible addition to functools, say, or is the use case 
too rare?

Terry Jan Reedy




More information about the Python-ideas mailing list