On Nov 16, 3:36 pm, Thomas Mlynarczyk <[EMAIL PROTECTED]> wrote: > Arnaud Delobelle schrieb: > > > If you want to simply 'set' the generator (by which I take you mean > > 'change its state') without without iterating it one step, then what you > > need is a class with an __iter__() method. Then you can change the > > state of the object between calls to next(). E.g. > >>>> class MyGenerator(object): > > ... def __init__(self, v): self.v = v > > ... def __iter__(self): > > ... for x in range(10): > > ... yield self.v > > ... > >>>> g = MyGenerator(5) > >>>> for i in g: > > ... g.v = input("val:") > > ... print i > > That's a good idea, thanks! Meanwhile I have succeeded in writing a > decorator which allows an argument for next():
Here's a different structure if you want it. Untested. def myway( g ): def init( *ar, **kw ): g= g( *ar, **kw ) class mygen( object ): def __iter__( self ): return self def next( self, s= None ): return g.next() if s is None else g.send( s ) def send( self, s ): return g.send( s ) return mygen return init And, if you don't intend to use 'myway' on 'listiterator's and such, 'send( None )' is equivalent to 'next( )'. def myway( g ): def init( *ar, **kw ): g= g( *ar, **kw ) class mygen( object ): def __iter__( self ): return self def next( self, s= None ): return g.send( s ) def send( self, s ): return g.send( s ) return mygen return init There's probably a typo in it. -- http://mail.python.org/mailman/listinfo/python-list