14.6. Generator Send
.send()
method allows to pass value to the generatordata = yield
will receive this "sent" value
14.6.1. Example
After running you have to send
None
value to begin processing
def run():
print('Starting worker...')
while True:
work = yield
print(f'Processing {work}')
worker = run()
worker.send(None)
Starting worker...
worker.send('job1')
Processing job1
worker.send('job2')
Processing job2
worker.send('job3')
Processing job3
from inspect import isgenerator, isgeneratorfunction
def run():
print('Starting worker...')
while True:
work = yield
print(f'Processing {work}')
worker = run()
worker.send(None)
Starting worker...
worker.send(1)
Processing 1
worker.send('hello')
Processing hello
worker.send([1,2,3])
Processing [1, 2, 3]
isgeneratorfunction(run)
True
isgenerator(worker)
True
14.6.2. Why Send None?!
After running you have to send
None
value to begin processingSending anything other will raise
TypeError
def run():
print('Starting worker...')
while True:
work = yield
print(f'Processing {work}')
worker = run()
type(worker)
<class 'generator'>
worker.send('hello')
Traceback (most recent call last):
TypeError: can't send non-None value to a just-started generator
14.6.3. Send Upstream Cascade
def worker():
print('Starting worker...')
while True:
work = yield
print(f'Processing {work}')
def run(gen):
gen.send(None)
while True:
x = yield
gen.send(x)
result = run(worker())
result.send(None)
Starting worker...
for x in range(0,3):
result.send(x)
Processing 0
Processing 1
Processing 2