Coroutines and argument tupling
Bjoern Schliessmann
usenet-mail-0306.20.chr0n0ss at spamgourmet.com
Thu Aug 16 05:40:54 EDT 2007
Marshall T. Vandegrift wrote:
> Without the decorator that becomes:
>
> gen = nextn(2)
> print gen.next() # => [0, 1]
> print gen.send(3) # => [2, 3, 4]
> print gen.send(1) # => [5]
>
> The former is just that smidgen nicer, and allows you to continue
> to make use of argument defaults and varadic arguments if so
> desired.
The solution I'd use is a decorator that calls next automatically
one time after instantiation. Then you can use send normally, and
don't have to care about any initial parameters, which makes the
code clearer (initial parameters should be used for setup purposes,
but not for the first iteration, IMHO). It'd look like this (from
PEP 342, http://www.python.org/dev/peps/pep-0342/):
def consumer(func):
def wrapper(*args,**kw):
gen = func(*args, **kw)
gen.next()
return gen
wrapper.__name__ = func.__name__
wrapper.__dict__ = func.__dict__
wrapper.__doc__ = func.__doc__
return wrapper
@consumer
def nextn():
...
gen = nextn()
print gen.send(2) # => [0, 1]
print gen.send(3) # => [2, 3, 4]
print gen.send(1) # => [5]
Regards,
Björn
--
BOFH excuse #60:
system has been recalled
More information about the Python-list
mailing list