[Python-ideas] reiter: decorator to make generators reiterable
Mathias Panzenböck
grosser.meister.morti at gmx.net
Sun May 30 17:34:19 CEST 2010
I think this decorator sould be included in itertools:
from functools import wraps
class ReIter(object):
__slots__ = 'f', 'args', 'kwargs'
def __init__(self,f,args,kwargs):
self.f = f
self.args = args
self.kwargs = kwargs
def __iter__(self):
return self.f(*self.args, **self.kwargs)
def reiter(f):
@wraps(f)
def _reiter(*args,**kwargs):
return ReIter(f,args,kwargs)
return _reiter
Using this you can iterate over the return value of a generator decorated with reiter as often as
you like (and not just once):
@reiter
def gen(x,y):
for i in xrange(x):
yield i*y
g = gen(5,3)
for x in g:
sys.stdout.write('%r\n' % x)
sys.stdout.write('\n')
for x in g:
sys.stdout.write('%r\n' % x)
The difference to tee is that old values are not remembered but the generator is evaluated when
__iter__() is called. This might come in handy when you implement methods like items(), values() and
keys() in a custom dict implementation.
Or is there already such a thing and I missed it?
-panzi
PS: Maybe it should be called regen/ReGen instead of reiter/ReIter?
PPS: Funny thing, both "Reiter" and "Regen" are german words. Reiter = rider or tab; Regen = rain.
More information about the Python-ideas
mailing list