When sending a value to a generator/coroutine, is there a way to avoid that initial next(g)
?
def gen(n):
m = (yield) or "did not send m to gen"
print(n, m)
g = gen(10)
next(g)
g.send("sent m to g") # prints "10 sent m to g"
Without next(g)
, we get
TypeError: can't send non-None value to a just-started generator
CodePudding user response:
The error stems from this bit of code in CPython's gen_send_ex2
, i.e. it occurs if gi_frame_state
is FRAME_CREATED
.
The only place that matters for this discussion that sets gi_frame_state
is here in gen_send_ex2
, after a (possibly None) value has been sent and a frame is about to be evaluated.
Based on that, I'd say no, there's no way to send a non-None value to a just-started generator.
CodePudding user response:
Not sure if this is helpful in your specific case, but you could use a decorator to initialize coroutines.
def initialized(coro_func):
def coro_init(*args, **kwargs):
g = coro_func(*args, **kwargs)
next(g)
return g
return coro_init
@initialized
def gen(n):
m = (yield) or "did not send m to gen"
print(n, m)
g = gen(10)
g.send("sent m to g") # prints "10 sent m to g"